• bzoj2348


    实在不懂为啥网上的题解都是二分,本人没写二分,wa的很惨结果竟然是printf("%d")的锅,改了就A了

    2348: [Baltic 2011]Plagiarism

    Time Limit: 1 Sec  Memory Limit: 256 MB
    Submit: 586  Solved: 265
    [Submit][Status][Discuss]

    Description

     
    世界编程大赛的选手们提交N份程序文件f1, …, fN给评测系统。在将评测结果正式公布之前,评委会想要排除一切可能的剽窃现象。他们已有一个对比程序,用来比较两份程序文件,并判断它们是否太过相似了。
    然而程序文件的数目相当大,把每两份(一对,pair)文件都进行比较的话将花太多的时间。另一方面,许多对(pair)可以直接被排除,如果文件的大小相差太大的话。
    更准确地说,评委会决定,如果每两份文件(一对,pair)中,较小文件的体积小于较大文件的体积的90%,那将直接不比较这样的一对(pair)。所以,对比程序只比较这样的一对(fi, fj): i≠j, size(fi )≤ size(fj )且size(fi )≥0.9∙size(fj )。
    编写程序计算有多少对(pair)文件需要被比较。
     

    Input

     
    第1行包含一个整数N,即提交的程序文件总数。
    第2行包含N个整数size(f1), …, size(fN),每个整数代表文件的体积大小。
     

    Output

    第1行,也是唯一的一行,给出一个整数,即需要被比较的文件的对(pair)的数目。
    数据范围
    1≤ N ≤100 000
    1≤ size(fi ) ≤100 000 000

    有50分的测试点中,1≤ N ≤2 000

    Sample Input

    5
    1 1 1 1 1

    Sample Output

    10

    HINT

    第2个样例中,每两个文件之间都要互相比较(当然,每对只比较一次,不是两次)。
     
    排完序之后,由于单调性,对于i,j满足条件则对于i+1,j仍然满足 (j>i+1)
    既然如此,直接用一个pos标记,然后O(n)扫就行了,复杂度完全说的过去啊
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 int n;
     5 int a[100010];
     6 ll ans=0;
     7 int main(){
     8     scanf("%d",&n);
     9     for(int i=1;i<=n;i++){
    10         scanf("%d",&a[i]);
    11     }
    12     sort(a+1,a+n+1);
    13     int pos=1;
    14     for(int i=1;i<=n;i++){
    15         while(pos+1<=n&&a[pos+1]*9<=a[i]*10)pos++;
    16         ans+=pos-i;
    17     }
    18     printf("%lld",ans); 
    19     return 0;
    20 } 
    View Code
  • 相关阅读:
    深入浅出Win32多线程程序设计【2】线程控制
    深入浅出Win32多线程程序设计【1】基本概念
    在两个ASP.NET页面之间传递值
    Javascript基础
    DataGrid的几个小技巧
    推荐取代Visio的中国人的软件——Edraw
    ASP.NET如何防范SQL注入攻击
    软件版本号规定原则
    三层体系结构总结(三)
    .Net工具 .NET文档生成工具2.2
  • 原文地址:https://www.cnblogs.com/Amphetamine/p/7276973.html
Copyright © 2020-2023  润新知