考试总结 2018-5-6

  好难啊……

  第一题根据题意和数据范围,应该是纯模拟没得说,好像有一点点贪心的意思。维护一个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;
}
book

  第二题的话。。根据推理和下面的提示知道了是要求组合数的,但是逆元啊快速幂啊我都用不到(自己太菜)。百度?我怎么会是那种人呢。于是写了一个正常的组合数,果然,只拿了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;

}
cube

为什么呢?因为这种方法模的时候和用乘法逆元模出来是不一样的,就导致大数据一模就直接错了。

  这里给出题解的伪代码,反正我还要是看不懂的。(我怎么记得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;  
}  
multiset

  后三道题。。。emmm,我tm一道都没看懂题意,心态爆照。但当时以为前三题都是a掉的了,于是就开心的放弃,去做校内oj的题了。

  这次考试再次锻炼了我的能力和心态和阅读能力,是一次很有意义的考试。

原文地址:https://www.cnblogs.com/qywyt/p/9031099.html