这道题的民间数据过于简单。
首先来说说我的代码,
//2024-10-26 22:54:20
#include <cstdio>
#include <algorithm>
using namespace std;
int n,mobs[114514];
bool attacked[114514];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&mobs[i]);
}
sort(mobs,mobs+n);
int ans=0,last=-1;
for(int i=0;i<n;i++){
for(int j=(last==-1?0:last);last<n;last++,j++){
if(mobs[last]>mobs[i]&&(!attacked[j])&&(i!=j)){
attacked[last]=1;
ans++,last++;
break;
}
}
}
printf("%d",n-ans);
return 0;
}
这是一份 O(nk) 时间复杂度的代码,其中 k 在没有被特殊构造的数据里是一个很小的数,大概在 10 与 30 间。但考试时 CCF 提供的测试样例点三中里有类似于下列输入样例的数据:
1000001 2 2 2 2 2 2 2 3 2 3 2 3 2 3 2 3 2 2 3 3 3 3 2 2 2 3 3 2 2 3 3 3 2 2 2 3 3 3 2 2 2 3 3 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3...
这种数据可以使 k 达到大约 n/2 ,从而使优化变得几乎不存在,也就不可能满分。但是在洛谷的民间数据当中,这份代码提交可以得满分,建议改良数据。
友情提示:我在考场上写这份代码运行第三个测试点时使用了 4s 的时间。