• Educational Codeforces Round 94 (Rated for Div. 2) 赛后总结及题解


    A    String Similarity

    题意:定义若两个长度相同的01串中,存在某一个位置,使得两字符串在该位置的字符相同(a[i]=b[i]),则称这两个字符串相似。现在给一个长度为2*n-1的01字符串s,要求构造一个长度为n的字符串,使得该字符串与给出字符串中的s[1..n],s[2..n+1],s[3..n+2],......,s[n..2*n-1]均相似。

    思路:对于每一对相似字符串,只要有一个位置上的字符相同即可。

    于是对于s[1..n]取出第一位,对于s[2..n+1]取出第二位......即s[1],s[3],s[5],......,s[2*n-1]组合起来,就可构造出答案。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 55
    #define mod 100000000
    typedef long long ll;
    using namespace std;
    char s[maxn];
    int main()
    {
        int T,i,n,len;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%s",&n,s);
            len=2*n-1;
            for (i=0;i<len;i+=2)
            {
                printf("%c",s[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    View Code

    B    RPG Protagonist

    题意:有两个容量分别为p、f的背包,有两种质量分别为s、w,数量分别为cnts,cntw的物品,要求输出背包能够装入的最大物品数。

    思路:贪心思想,先枚举p背包装入的s物品数(这里假设s<w),剩余的容量尽可能装入f物品;对于f背包先尽可能装入s物品,剩余的容量尽可能装入f物品。

    在每次枚举后得到的最大物品数中取最大值就是答案。

    比赛的时候我思维混乱,一度想到背包,二分等等 _(:_」∠)_就这么个题卡了半天。。

    其实想到二分验证的时候有想到贪心思路了,然而想得不够,贪错了。。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 55
    #define mod 100000000
    typedef long long ll;
    using namespace std;
    int p,f,s,w,cnts,cntw;
    int cnt,ans,lim;
    int main()
    {
        int T,i,j,k,t;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%d",&p,&f);
            scanf("%d%d",&cnts,&cntw);
            scanf("%d%d",&s,&w);
            if (s>w) 
            {
                swap(s,w); 
                swap(cnts,cntw);
            }
            ans=0;
            lim=p/s;
            lim=min(cnts,lim);
            for (i=0;i<=lim;i++)
            {
                k=min((p-i*s)/w,cntw);
                cnt=i+k;
                j=min(cnts-i,f/s);
                t=min((f-j*s)/w,cntw-k);
                cnt+=j+t;
                if (cnt>ans) ans=cnt; 
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code

    C    Binary String Reconstruction

    题意:给一个01串s,要求输出它对应的01串w,若不存在符合条件的w串则输出-1。其中若w[i-x]==1或w[i+x]==1时,s[i]为1;若不满足则s[i]=0。

    思路:对于s串中每一个0,都有w[i-x]==0且w[i+x]==0(若存在)。

    因此预处理将w的每一位赋值为1,先将s中的所有0对应的w[i-x]和w[i+x]标记为0,再处理s中的每一位1,若对应的w[i-x]与w[i+x]均被标记为0,说明不存在符合条件的w串,输出-1。

    最后直接输出w串就可以了。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 100010
    typedef long long ll;
    using namespace std;
    int ans[maxn];
    char s[maxn];
    int main()
    {
        int T,i,x,len,flag,cnt;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%s%d",s,&x);
            len=strlen(s);
            flag=0;
            for (i=0;i<len;i++) ans[i]=1;
            for (i=0;i<len;i++)
            {
                if (s[i]=='0') 
                {
                    if (i-x>=0) ans[i-x]=0;
                    if (i+x<len) ans[i+x]=0;
                }
            }
            for (i=0;i<len;i++)
            {
                if (s[i]=='1')
                {
                    cnt=0;
                    if (i-x<0 || ans[i-x]==0) cnt++;
                    if (i+x>=len || ans[i+x]==0) cnt++;
                    if (cnt==2) 
                    {
                        flag=1;break;
                    }
                 }
            }
            if (flag) 
            {
                printf("-1
    ");
                continue;
            }
            else 
            {
                for (i=0;i<len;i++) printf("%d",ans[i]);
                printf("
    ");
            }
        }
        return 0;
    }
    View Code

    D    Zigzags

    题意:给定一个数组a,问存在几种i,j,k,l的组合,使得i<j<k<l且a[i]==a[k],a[j]==a[l]。

    思路:枚举j,用cnt数组统计j之前a[i]出现的次数,再从j+1开始寻找l,在寻找l的过程中,统计j与l之间每个k对应的i的数量(就是cnt[a[k]]),累加起来记作tot(即符合i<j<k且a[i]==a[k]的ik的对数),每当找到一个对应的l,就将答案加上tot。

    想起来可能有点绕,手动模拟一下过程会好理解一点。(代码极短)

    比赛时完全没想到这么写。。感觉这个代码还是挺巧妙的。。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 3005
    typedef long long ll;
    using namespace std;
    int n,a[maxn],cnt[maxn];
    ll ans,tot;
    int main()
    {
        int T,i,j,l;
        scanf("%d",&T);
        while (T--)
        {
            ans=0;
            memset(cnt,0,sizeof(cnt));
            scanf("%d",&n);
            for (i=1;i<=n;i++) scanf("%d",&a[i]); 
            for (j=1;j<n;j++)
            {
                tot=0;
                for (l=j+1;l<=n;l++)
                {
                    if (a[j]==a[l]) ans+=tot;
                    tot+=cnt[a[l]];
                }
                cnt[a[j]]++;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    View Code

    E    Clear the Multiset

    F    x-prime Substrings

    G    Mercenaries

  • 相关阅读:
    十一:jinja2模板传参
    Python基础—流程控制
    Python字符串格式化输出
    Python基本数据类型--列表、元组、字典、集合
    Python基本数据类型之字符串、数字、布尔
    Python用户输入和代码注释
    Python中变量和常量的理解
    Python程序的执行方式
    Python初识
    python初识
  • 原文地址:https://www.cnblogs.com/lsykk/p/13579517.html
Copyright © 2020-2023  润新知