CodeForces - 1367

CodeForces - 1367

A - Short Substrings

很显然 前两个字母都取 之后隔一个取一个

char s[maxn],ans[maxn];
int t;
int main()
{
     
    scanf("%d",&t);
    while(t--)
    {
     
        int m=0;
        scanf("%s",s);
        ans[m++]=s[0];ans[m++]=s[1];
        for (int i=3;i<strlen(s);i+=2)ans[m++]=s[i];
        repp(i,0,m)printf("%c",ans[i]);puts("");
    }
    return 0;
}



B - Even Array

判断两种不同类型的非法情况是否相等

int t,n,x;
int main()
{
     
    scanf("%d",&t);
    while(t--)
    {
     
        int ji=0,ou=0;
        scanf("%d",&n);
        rep(i,0,n-1)
        {
     
            scanf("%d",&x);
            if (i%2==x%2)continue;
            if (x%2==1)ji++;
            if (x%2==0)ou++;
        }
        if (ji==ou)W(ji);
        else W(-1);
    }
    return 0;
}



C - Social Distance

暴力预处理后再计算答案

int t,n,k;
char s[maxn];
bool ok[maxn];
int solve(int x)
{
     
    if (x%(k+1)==0)return x/(k+1);
    else return x/(k+1)+1;
}
int main()
{
     
    scanf("%d",&t);
    while(t--)
    {
     
        mem(ok,true);
        scanf("%d%d",&n,&k);
        scanf("%s",s);
        int sz=strlen(s);
        repp(i,0,sz){
     if (s[i]=='1'){
     rep(j,max(i-k,0),min(i+k,sz-1))ok[j]=false;}}
        int num=0,ans=0;
        repp(i,0,sz)
        {
     
            if (ok[i])num++;
            else
            {
     
                ans+=solve(num);
                num=0;
            }
        }
        ans+=solve(num);
        W(ans);
    }
    return 0;
}



D - Task On The Board

b[i]=0的位置肯定填当前剩余字母中最大的
如果这个最大字母不够数量,就置为0,向下直到找到一个符合的字母。
每次找到合适字母填上之后,要对其余的b[i]减去距离
比Second大的有且只有First,所以每次去掉距离后,填Second的位置的b[]必被减为0
重复操作

int t,m,b[maxn],num[maxn],sz;
char s[maxn],ans[maxn];
bool vis[maxn];
vector<int> V;
bool check()
{
     
    rep(i,1,m)if (ans[i]=='#')return false;
    return true;
}
int main()
{
     
    scanf("%d",&t);
    while(t--)
    {
     
        mem(num,0);mem(vis,false);
        scanf("%s",s);
        sz=strlen(s);
        repp(i,0,sz)num[s[i]-'a']++;
        scanf("%d",&m);
        rep(i,1,m)ans[i]='#',scanf("%d",&b[i]);
        while(!check())
        {
     
            V.clear();
            rep(i,1,m)
            {
     
                if (vis[i]||b[i])continue;
                V.pb(i);
                vis[i]=true;
            }
            for (int i=25;i>=0;i--)
            {
     
                if (num[i]>=V.size())
                {
     
                    num[i]=0;
                    repp(j,0,V.size())ans[V[j]]='a'+i;
                    break;
                }
                num[i]=0;
            }
            repp(i,0,V.size())rep(j,1,m)if (!vis[j])b[j]-=abs(V[i]-j);
        }
        rep(i,1,m)printf("%c",ans[i]);puts("");
    }
    return 0;
}



E - Necklace Assembly

假设取的长度为i
gcd(i,k)即为循环元的长度
i/(gcd(i,k))即为循环元的个数
假设字母'a'参与循环元的组成,则a的个数x与循环元中a的个数y的关系是:y=x/(i/(gcd(i,k)))
对每个字母都进行遍历,如果最终能组成循环元的最大长度大于gcd(i,k),则符合条件

int t,n,k,num[30];
char s[maxn];
int main()
{
     
    scanf("%d",&t);
    while(t--)
    {
     
        int ans=0;
        mem(num,0);
        scanf("%d%d",&n,&k);
        scanf("%s",s);
        repp(i,0,strlen(s))num[s[i]-'a']++;
        rep(i,1,n)
        {
     
            int T=__gcd(i,k);
            int Blocksize=i/T;
            int cnt=0;
            rep(j,0,25)cnt+=num[j]/Blocksize;
            if (cnt>=T)ans=max(ans,i);
        }
        W(ans);
    }
    return 0;
}

你可能感兴趣的:(Codeforces)