开场网络卡了将近一个小时QaQ
才好不容易把A题卡出来了
00:51:24 Problem A Accepted
01:09:54 Problem B Accepted
01:45:51 Problem C Wrong answer on pretest 4
简单概述下:
AB都是水题 (可能对于真正的大佬来说这些都是水题) 。
C吧,乍一看,没懂,再一看,还是没懂。
代码的创建时间表明,我可能看了二十多分钟的题 (实际应该不止)
终于自认为读懂题意了,于是开始打代码。
想了好一会儿,憋出以下代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=4e5+5;
int maxdif=1,n,I,a[maxn],qz[maxn],ans=0x7fffffff;
int cnt=1,c[maxn],lst=-1;
int main(){
scanf("%d%d",&n,&I);
for(int i=0;i<I;i++){
maxdif*=2;
if(maxdif>maxn)
break;
}
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]==lst)c[cnt]++;
else{c[++cnt]++;lst=a[i];}
}
if(cnt<=maxdif){puts("0");return 0;}
int dis=cnt-maxdif;
for(int i=1;i<=cnt+1;i++)qz[i]=qz[i-1]+c[i];
for(int i=0;i<=dis;i++){
int j=cnt-(dis-i);
ans=min(ans,qz[i]+qz[cnt]-qz[j]);
}
printf("%d",ans);
return 0;
}
大体思路是排序,计数,掐头去尾找一找
于是就Wrong answer on pretest 4
了。。。
可是样例全过了啊啊啊啊啊啊,为什么呢??
又想了半天,发现了真相——题读错了┭┮﹏┭┮
实际上一开始对于maxdif
——最大不同数字数量
的计算就出现了问题,我误以为
2
I
2^I
2I就是maxdif
经过n遍读题后,发现并不是 (可为什么样例如此毒瘤以致于我样例全过。。。) ;;;实际上应该是:
m
a
x
d
i
f
=
2
⌊
I
∗
8
/
n
⌋
maxdif=2^{\lfloor I*8/n \rfloor }
maxdif=2⌊I∗8/n⌋
修改完毕的代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=4e5+5;
int maxdif=1,n,I,a[maxn],qz[maxn],ans=0x7fffffff;
int cnt=1,c[maxn],lst=-1;
int main(){
scanf("%d%d",&n,&I);I*=8;int k=I/n;
for(int i=0;i<k;i++){
maxdif*=2;
if(maxdif>maxn)break;
}
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]==lst)c[cnt]++;
else{c[++cnt]++;lst=a[i];}
}
if(cnt<=maxdif){puts("0");return 0;}
int dis=cnt-maxdif;
for(int i=1;i<=cnt+1;i++)qz[i]=qz[i-1]+c[i];
for(int i=0;i<=dis;i++){
int j=cnt-(dis-i);
ans=min(ans,qz[i]+qz[cnt]-qz[j]);
}
printf("%d",ans);
return 0;
}
然而这段代码是在比赛结束后35秒调试完成的,于是。。。┭┮﹏┭┮
当前尚未开放测评,开放后我会提交一下
2019.7.31 8:31
更改后果然AC了┭┮﹏┭┮
测评:http://codeforces.com/contest/1199/submission/58046887