zoukankan      html  css  js  c++  java
  • Codeforces Round #650 (Div. 3) 题解

    Problem A

    我真是个傻逼,本来想判一下和前一项是否相等的,但是t3明显就不对,后面发现就是一个模拟题,直接甲加一输出就好了。

    Problem B

    首先,和下标奇偶性一样的显然不需要动,那么就是看不相等的数目,因为一次交换可以使得两个不相等的恢复,如果这个两种数量不一样,那么输出-1.

    Problem C

    他给你的一定是合法的,或者是特殊情况,对于一个合法的串,我们考虑因为在已有的1的范围内不能有顾客,我们打上标记,然后再去从头坐人,每做一个人就让下标+k继续判断就好了。

    Problem D

    首先,0一定是字典序最大的那个字母,那么我们肯定是要统计字符串里面字母出现的次数,然后我们统计字典序最大的字母出现的次数是否大于0的个数,大于的话,就把这个位置的答案串修改成这个字符,同时重构这个数量,不停做上述操作就好了。

    代码实现

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    #include<iostream>
    #include<set>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define rep(i,f_start,f_end) for (int i=f_start;i<=f_end;++i)
    #define per(i,n,a) for (int i=n;i>=a;i--)
    #define MT(x,i) memset(x,i,sizeof(x) )
    #define rev(i,start,end) for (int i=start;i<end;i++)
    #define inf 0x3f3f3f3f
    #define mp(x,y) make_pair(x,y)
    #define lowbit(x) (x&-x)
    #define MOD 1000000007
    #define exp 1e-8
    #define N 1000005 
    #define fi first 
    #define se second
    #define pb push_back
    typedef long long ll;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    typedef vector <int> VI;
    typedef pair<int ,int> PII;
    typedef pair<int ,PII> PIII;
    ll gcd (ll a,ll b) {return b?gcd (b,a%b):a; }
    inline int read() {
        char ch=getchar(); int x=0, f=1;
        while(ch<'0'||ch>'9') {
            if(ch=='-') f=-1;
            ch=getchar();
        } while('0'<=ch&&ch<='9') {
            x=x*10+ch-'0';
            ch=getchar();
        } return x*f;
    }
    
    int t,n,m,b[60],val[27];
    string s;
    int vis[60];
    char ans[60];
    
    int main () {
        int t;
        scanf ("%d",&t);
        while (t--) {
            MT (vis,0),MT (ans,'0'),MT (val,0);
            int m;
            cin>>s;
            scanf ("%d",&m);
            rep (i,1,m) scanf ("%d",&b[i]); 
            rev (i,0,s.size ()) val[s[i]-'a'+1]++;
            int num=0,zero=0,k=27;
            while (num!=m) {
                zero=0;
                rep (i,1,m) if (b[i]==0&&vis[i]==0) zero++;
                for (int i=k-1;i>0;i--) if (val[i]>=zero) {
                    k=i;
                    break;
                }
                rep (i,1,m) if (vis[i]==0&&b[i]==0) {
                    vis[i]++,num++;
                    ans[i]=k+'a'-1;
                } 
                rep (i,1,m) if (b[i]==0&&ans[i]==k+'a'-1) {
                    rep (j,1,m) if (b[j]) b[j]-=abs (j-i);
                }
            }
            rep (i,1,m) printf ("%c",ans[i]);
            printf ("
    ");
        }
    	return 0;
    }
    

    Problem E

    这道题是这样,首先肯定有循环节,但是他说转k次可以,那么循环节的长度不一定是k,也可能是k的因子,那么我们去枚举k的因子,接着在数量的限制下,枚举循环节的数量,然后统计字串里面的字母数,判断下能否组成长度为枚举的因子的循环节,取最大值就好了。

    代码实现

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    #include<iostream>
    #include<set>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define rep(i,f_start,f_end) for (int i=f_start;i<=f_end;++i)
    #define per(i,n,a) for (int i=n;i>=a;i--)
    #define MT(x,i) memset(x,i,sizeof(x) )
    #define rev(i,start,end) for (int i=start;i<end;i++)
    #define inf 0x3f3f3f3f
    #define mp(x,y) make_pair(x,y)
    #define lowbit(x) (x&-x)
    #define MOD 1000000007
    #define exp 1e-8
    #define N 1000005 
    #define fi first 
    #define se second
    #define pb push_back
    typedef long long ll;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    typedef vector <int> VI;
    typedef pair<int ,int> PII;
    typedef pair<int ,PII> PIII;
    ll gcd (ll a,ll b) {return b?gcd (b,a%b):a; }
    inline int read() {
        char ch=getchar(); int x=0, f=1;
        while(ch<'0'||ch>'9') {
            if(ch=='-') f=-1;
            ch=getchar();
        } while('0'<=ch&&ch<='9') {
            x=x*10+ch-'0';
            ch=getchar();
        } return x*f;
    }
    
    string s;
    int vis[200],k,n,t;
    
    vector <int> v;
    
    int main () {
        scanf ("%d",&t);
        while (t--) {
            v.clear ();
           scanf ("%d%d",&n,&k);
           for (int i='a';i<='z';i++) vis[i]=0;
           cin>>s;
           for (auto it:s) vis[it]++;
           int ans=0;
           rep (i,1,n) {
               if (k%i==0) {
                   for (int j=1;i*j<=n;j++) {
                       int cnt=0;
                       for (int p='a';p<='z';p++) {
                           cnt+=vis[p]/j;
                       }
                       if  (cnt>=i) ans=max (ans,i*j);
                   }
               }
           }
           printf  ("%d
    ",ans);
        }
    	return 0;
    }
    
  • 相关阅读:
    一本书
    在linux oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本
    关于仿酷狗音乐播放器开源:寻求一套音乐播放器素材,让仿酷狗开源
    Cocos2d-x中Vector&lt;T&gt;容器以及实例介绍
    成都传智播客Java/PHP培训就业率高
    P1341 无序字母对
    P1168 中位数
    P1146 硬币翻转
    P1340 兽径管理
    P2023 [AHOI2009]维护序列
  • 原文地址:https://www.cnblogs.com/hhlya/p/13601359.html
Copyright © 2011-2022 走看看