zhber
有好多做过的题没写下来,如果我还能记得就补吧

Description

 
世界编程大赛的选手们提交N份程序文件f1, …, fN给评测系统。在将评测结果正式公布之前,评委会想要排除一切可能的剽窃现象。他们已有一个对比程序,用来比较两份程序文件,并判断它们是否太过相似了。
然而程序文件的数目相当大,把每两份(一对,pair)文件都进行比较的话将花太多的时间。另一方面,许多对(pair)可以直接被排除,如果文件的大小相差太大的话。
更准确地说,评委会决定,如果每两份文件(一对,pair)中,较小文件的体积小于较大文件的体积的90%,那将直接不比较这样的一对(pair)。所以,对比程序只比较这样的一对(fifj): i≠j, size(f)≤ size(fj)且size(f)≥0.9∙size(f)。
编写程序计算有多少对(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个样例中,每两个文件之间都要互相比较(当然,每对只比较一次,不是两次)。
 
水题……找出所有0.9<=a[i]/a[j]<=1的(i,j)的对数
排个序完每次二分找出最大的a[i]/a[j]<0.9的i在哪里,然后[i+1,j]都是了
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
long long ans;
int n,l,r;
int a[100010];
int main()
{
	n=read();
	for (int i=1;i<=n;i++)a[i]=read();
	sort(a+1,a+n+1);
	for (int i=1;i<=n;i++)
	{
		l=1;r=i;
		while (l<=r)
		{
			int mid=(l+r)>>1;
			if (a[mid]*10>=a[i]*9)r=mid-1;
			else l=mid+1;
		}
		ans+=i-l;
	}
	printf("%lld\n",ans);
}

 

posted on 2014-12-24 20:00  zhber  阅读(305)  评论(0编辑  收藏  举报