P4670 [BalticOI 2011] Plagiarism (Day2)
题目描述
世界编程竞赛的参与者向评分系统提交了 N N N 个解决方案文件 f 1 , . . . , f N f_1 ,...,f_N f1,...,fN。在接受结果为最终结果之前,评审团希望排除任何抄袭的可能性。他们有一个程序,可以将两个文件进行比较,以决定它们是否过于相似。然而,文件的数量相当大,比较所有对将花费太多时间。另一方面,许多对可以基于文件大小差异过大而快速排除。更确切地说,评审团决定完全跳过比较每一对,其中较小文件的大小小于较大文件大小的 90%。因此,比较程序只需检查那些不同的文件对 ( f i , f j ) (f_i, f_j) (fi,fj),其中 i ≠ j , s i z e ( f i ) ≤ s i z e ( f j ) i \ne j, size(f_i) \le size(f_j) i=j,size(fi)≤size(fj) 且 s i z e ( f i ) ≥ 0.9 × s i z e ( f j ) size(f_i) \ge 0.9 \times size(f_j) size(fi)≥0.9×size(fj)。编写一个程序来计算需要检查的文件对的数量。
输入格式
输入的第一行包含整数 N N N,表示提交的解决方案文件的数量。第二行包含 N N N 个整数 s i z e ( f 1 ) , ⋯ , s i z e ( f N ) size(f_1),\cdots,size(f_N) size(f1),⋯,size(fN),每个整数表示一个文件的大小。
输出格式
输出的第一行且唯一一行必须包含一个整数,即需要检查的文件对的数量。
输入输出样例 #1
输入 #1
2
2 1
输出 #1
0
输入输出样例 #2
输入 #2
5
1 1 1 1 1
输出 #2
10
说明/提示
对于 50 % 50\% 50% 的数据, 1 ≤ N ≤ 2000 1 \le N \le 2000 1≤N≤2000。对于所有数据, 1 ≤ N ≤ 10 5 , 1 ≤ f i ≤ 10 8 1 \le N \le 10^5,1 \le f_i \le 10^8 1≤N≤105,1≤fi≤108。
题面翻译由 ChatGPT-4o 提供。
C++实现
#include"cstdio"
#include"algorithm"
int n,s,f[100001];
bool cmp(int x,int y){
return x>y;
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d",&f[i]);
std::sort(f+1,f+1+n,cmp);
for(register int i=1;i<=n;i++){
for(register int j=i+1;j<=n;j++){
if(f[j]>=0.9*f[i])s++;
}
}
printf("%d",s);
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容