Codeforces Round #256 (Div. 2)总结

来源:互联网 发布:张艺兴和sm知乎 编辑:程序博客网 时间:2024/06/05 15:52

这次CF状态之悲剧,比赛就别提了。后来应该好好总结。

A题:某个细节没考虑到,导致T了

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;int a[4],b[4],n;int main(){    while(scanf("%d%d%d",&a[0],&a[1],&a[2])!=EOF)    {        scanf("%d%d%d",&b[0],&b[1],&b[2]);        scanf("%d",&n);        int suma=a[0]+a[1]+a[2];        int sumb=b[0]+b[1]+b[2];        int res=n-((suma-1)/5+1);        if(res<0)        {            printf("NO\n");            continue;        }        if(suma==0)            res=n;        if(sumb&&(sumb-1)/10+1>res)        {            printf("NO\n");            continue;        }        printf("YES\n");    }    return 0;}

B题:最开始居然以为要用后缀数组那些,结果~大水题一个。需要注意的是对于题目所给的用后缀自动机的方案,应该考虑相对顺序。即可以删除中间的某些值,达到变换到所要求字符串的目的。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;const int maxn=200;char stra[maxn],strb[maxn];int cnt[2][30];int main(){    while(scanf("%s%s",stra,strb)!=EOF)    {        memset(cnt,0,sizeof(cnt));        if(strstr(stra,strb)!=NULL)        {            printf("automaton\n");            continue;        }        int now=0;        int lena=strlen(stra);        int lenb=strlen(strb);        for(int i=0;i<lena;i++)            if(stra[i]==strb[now])            {                now++;                if(now==lenb)                    break;            }        if(now==lenb)        {            printf("automaton\n");            continue;        }        for(int i=0;i<lena;i++)                cnt[0][stra[i]-'a']++;        for(int i=0;i<lenb;i++)            cnt[1][strb[i]-'a']++;        bool is=false;        for(int i=0;i<27;i++)            if(cnt[0][i]!=cnt[1][i])            {                is=true;                break;            }        if(!is)        {            printf("array\n");            continue;        }        is=false;        for(int i=0;i<27;i++)            if(cnt[0][i]<cnt[1][i])            {                is=true;                break;            }        if(!is)        {            printf("both\n");            continue;        }        printf("need tree\n");    }    return 0;}

C题:比赛的时候我都不知道在想什么,比较简单的一个题,分治贪心就好

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;const int inf=1<<29;const int maxn=5100;int n,a[maxn];int DFS(int sl,int sr){    if(sl>sr)        return 0;    int mini=inf,ans=0;    for(int i=sl;i<=sr;i++)        mini=min(mini,a[i]);    for(int i=sl;i<=sr;i++)        a[i]-=mini;    ans+=mini;    int l=sl;    for(int i=sl;i<=sr;i++)        if(!a[i])        {            ans+=DFS(l,i-1);            l=i+1;        }    if(l<=sr)        ans+=DFS(l,sr);    return min(ans,sr-sl+1);}int main(){    while(scanf("%d",&n)!=EOF)    {        int mini=inf;        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        printf("%d\n",DFS(1,n));    }    return 0;}

D题:二分查找

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;long long n,m,k;bool check(long long val){    long long ans=0;    for(int i=1;i<=n;i++)        ans+=min(m,val/i);    return ans>=k;}int main(){    while(scanf("%I64d%I64d%I64d",&n,&m,&k)!=EOF)    {        long long l=0,r=n*m,ans;        while(l<=r)        {            long long mid=(l+r)>>1;            if(check(mid))            {                ans=mid;                r=mid-1;            }            else                l=mid+1;        }        printf("%I64d\n",ans);    }    return 0;}



E题:这个题需要各种优化,个人觉得。首先应该考虑对1的特殊处理,因为1下去无论如何都是1,所以应该直接输出就行。对于其它素数的情况也可以直接输出答案(注意输出1),应为它中间不会再有其他因子(除了1以外)。然后剩下的就是优化各种细节,比如当当前的数大于1e5的时候,以及对k=0与k>1e5的特殊处理

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<vector>#include<algorithm>#include<cmath>using namespace std;const int maxm=1e5;long long x,k,cnt=0;vector<long long> g;void DFS(long long u,long long index){    if(cnt>=maxm)        return;    if(index==0)    {        cnt++;        printf("%I64d ",u);        return;    }    if(u==1)    {        printf("1 ");        cnt++;        return;    }    int last=0;    for(int i=0;u>=g[i]&&i<g.size();i++)        if(u%g[i]==0)        {            if(last==0&&u!=1&&u==g[i])            {                for(int j=0;j<index-1;j++)                {                    printf("1 ");                    if(++cnt>=maxm)                        return;                }                printf("%I64d ",g[i]);                cnt++;                return;            }            last=i;            DFS(g[i],index-1);            if(cnt>=maxm)                return;        }}int main(){    while(scanf("%I64d%I64d",&x,&k)!=EOF)    {        g.clear();        cnt=0;        if(k==0)        {            printf("%I64d",x);            continue;        }        if(x==1)        {            printf("1");            continue;        }        if(k>maxm)        {            printf("1");            for(long long i=0;i<maxm-1;i++)                printf(" 1");            printf("\n");        }        else        {            long long up=x+1,sq=sqrt(x)+1;            for(long long i=1;i<min(up,sq);i++)                if(x%i==0)                {                    if(x/i!=i)                        g.push_back(x/i);                    g.push_back(i);                    up=x/i;                }            sort(g.begin(),g.end());            for(int i=0;i<g.size();i++)                DFS(g[i],k-1);        }        printf("\n");    }    return 0;}


0 0
原创粉丝点击