好难啊……
第一题根据题意和数据范围,应该是纯模拟没得说,好像有一点点贪心的意思。维护一个sum5和sum10,反正sum20是用不到的。
int i,n,t; int sum5,sum10; int main() { ios::sync_with_stdio(false); freopen("book.in","r",stdin); freopen("book.out","w",stdout); cin>>n; for(i=1;i<=n;i++) { cin>>t; if(t==20) { if(sum10>=1&&sum5>=1) { sum10--; sum5--; continue; } if(sum5>=3) { sum5-=3; continue; } cout<<"NO"; return 0; } if(t==10) { if(sum5>=1) { sum5--; sum10++; continue; } cout<<"NO"; return 0; } sum5++; } cout<<"YES"; return 0; }
第二题的话。。根据推理和下面的提示知道了是要求组合数的,但是逆元啊快速幂啊我都用不到(自己太菜)。百度?我怎么会是那种人呢。于是写了一个正常的组合数,果然,只拿了30分。
int i; int n,k,C; int main() { ios::sync_with_stdio(false); freopen("cube.in","r",stdin); freopen("cube.out","w",stdout); cin>>n>>k; cin>>i>>i>>i; C=1; for(i=1;i<=k;i++) { C=(C*(n-i+1)/i)%1000000007; } cout<<C; }
为什么呢?因为这种方法模的时候和用乘法逆元模出来是不一样的,就导致大数据一模就直接错了。
这里给出题解的伪代码,反正我还要是看不懂的。(我怎么记得pow在<cmath>里是有的?)
第三题嘛,逆过来就是一道贪心了,虽然不知道怎么证明,但直觉告诉我是可以的,参照n的范围。。。于是就开心的AC掉了。
int i, t,n,m,ans; int a[1000010],sum[1000010]; int main() { ios::sync_with_stdio(false); freopen("multiset.in","r",stdin); freopen("multiset.out","w",stdout); cin>>n; for (i=0;i<n;i++) { cin>>a[i]; m=max(m,a[i]); sum[a[i]]++; } t=sum[0]; for(i=1;i<=m;i++) { t=(t+1)>>1; ans++; t=t+sum[i]; } for(;t!=1;t=(t+1)>>1) ++ans; cout<<ans; return 0; }
后三道题。。。emmm,我tm一道都没看懂题意,心态爆照。但当时以为前三题都是a掉的了,于是就开心的放弃,去做校内oj的题了。
这次考试再次锻炼了我的能力和心态和阅读能力,是一次很有意义的考试。