• BZOJ2348 [Baltic 2011]Plagiarism


    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个样例中,每两个文件之间都要互相比较(当然,每对只比较一次,不是两次)。
     
    将体积排序,二分查找即可。
     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 int num[100001];
     5 long long ans;
     6 int main()
     7 {
     8     int n;
     9     scanf("%d", &n);
    10     for (int i = 1;  i <= n; i++)
    11     {
    12         scanf("%d", &num[i]);
    13     }
    14     sort (num + 1, num + 1 + n);
    15     for (int i = 1; i  <= n; i++)
    16     {
    17         int l = 1,r = i;
    18         while (l <= r)
    19         {
    20             int mid = (l + r)/2;
    21             if (num[mid]*10 >= num[i]*9)//a[j] > a[i] *0.9
    22             r = mid - 1;
    23             else l = mid + 1;
    24         }
    25         ans += (long long)i-l;
    26     }
    27     printf("%lld",ans);
    28     return 0;
    29 }
  • 相关阅读:
    增加新分类daily——“每天学了啥?”
    gcc选项中的编译过程
    一个带路径复制的perl脚本
    git
    mysql explain 详解
    CentOS Python2.4升级到Python2.7
    mongoDb查询
    linux php 扩展
    php-redis 扩展安装
    redis Linux的安装方法
  • 原文地址:https://www.cnblogs.com/z52527/p/4594312.html
Copyright © 2020-2023  润新知