zoukankan      html  css  js  c++  java
  • Codeforces Round #256 (Div. 2)总结

    这次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
    ");
                continue;
            }
            if(suma==0)
                res=n;
            if(sumb&&(sumb-1)/10+1>res)
            {
                printf("NO
    ");
                continue;
            }
            printf("YES
    ");
        }
        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
    ");
                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
    ");
                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
    ");
                continue;
            }
            is=false;
            for(int i=0;i<27;i++)
                if(cnt[0][i]<cnt[1][i])
                {
                    is=true;
                    break;
                }
            if(!is)
            {
                printf("both
    ");
                continue;
            }
            printf("need tree
    ");
        }
        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
    ",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
    ",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("
    ");
            }
            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("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    Libcurl
    Inno Setup教程
    APICloud平台的融云2.0集成
    关于mysql建立索引 复合索引 索引类型
    linux恢复误删除文件-extundelete
    OpenStack QA
    Android之应用程序怎样调用支付宝接口
    NYOJ 22 素数求和问题
    Mycat(5):聊天消息表数据库按月分表实践,平滑扩展
    opencv对图像进行边缘及角点检測
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184788.html
Copyright © 2011-2022 走看看