Codeforces Round #487 (Div. 2) ABC总结

这次本来是稳稳的上分场。。。然后B挂了终测。。。然后C没做出来。。。然后就没有然后了

(本校只有我B挂终测了)

A题就是给你一段字符串让你你判断是否存在连续三个字母包含ABC三个字母。直接暴力。(本场我通过的唯一一道题)

B题就是给你一段01序列,其中包含'.' 长度为n(n<2000),给你一个数p(p<2000) ,你要在.上填上0或者1,使得存在i,s[i]!=s[i+p]。注意,所有.必须填上0或1

其实只需要暴力枚举所有情况即可,因为没有充分枚举所有情况导致本场大量的人挂了本题。。。


tmp为1表示合法情况,最后再处理掉所有的.即可。

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=300010;
int n,m,k,flag,f;
int ans,cnt,tmp;
int a[maxn],c[maxn];
char s[maxn];
int main()
{
    int T,cas=1;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        scanf("%s",s);
        ans=1; flag=1;
        tmp=0;
        int l=n;
        for(int i=0;i+m<n;i++) {
            if(s[i]=='.'&&s[i+m]=='.')
            {
                s[i]='0';s[i+m]='1';
                tmp=1;break;
            }
            else if(s[i]=='.'&&s[i+m]=='0') {s[i]='1';tmp=1;break;}
            else if(s[i]=='.'&&s[i+m]=='1') {s[i]='0';tmp=1;break;}
            else if(s[i]=='0'&&s[i+m]=='.') {s[i+m]='1';tmp=1;break;}
            else if(s[i]=='1'&&s[i+m]=='.') {s[i+m]='0';tmp=1;break;}
            else if(s[i]!=s[i+m]) {tmp=1;break;}
        }
    for(int i=0;i<n;i++)
    if(s[i]=='.'){s[i]='0';}
    if(!tmp) puts("No");
    else
    {
        printf("%s\n",s);
    }
    }
    return 0;
}

C题就是给你四个数A,B,C,D(都小于200)让你你构造一个不超过50*50的矩阵,使得其中的A、B、C、D四个字符的连通块数量分别为输入的四个数。

其实只需要把50*50的矩阵分成四块,分别为25*25的 A,B,C,D四种字符,然后往里加字母即可。。。(我写的是D加入A中,B加入C中,C加入B中,D加入A中。)

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=310;
int n,m,k,flag,f;
int ans,cnt,tmp;
int a,b,c,d;
char s[maxn][maxn];
int main()
{
    int T,cas=1;
    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
    {
        a--;b--;c--;d--;
        for(int i=0;i<50;i++)
        for(int j=0;j<50;j++)
        {
            if(i<25&&j<25) s[i][j]='A';
            else if(i<25&&j>=25) s[i][j]='B';
            else if(i>=25&&j<25) s[i][j]='C';
            else s[i][j]='D';
        }
        for(int i=0;i<50;i++)
        {
            s[i][50]='\0';
        }
        for(int i=26;i<49;i+=2)
        for(int j=26;j<49;j++)
        if(a>0&&s[i-1][j]!='A'&&s[i+1][j]!='A'&&s[i][j+1]!='A'&&s[i][j-1]!='A'){
            s[i][j]='A'; a--;
        }
        for(int i=1;i<24;i+=2)
        for(int j=1;j<24;j++)
        if(d>0&&s[i-1][j]!='D'&&s[i+1][j]!='D'&&s[i][j+1]!='D'&&s[i][j-1]!='D'){
            s[i][j]='D'; d--;
        }
        for(int i=1;i<24;i+=2)
        for(int j=26;j<49;j++)
        if(c>0&&s[i-1][j]!='C'&&s[i+1][j]!='C'&&s[i][j+1]!='C'&&s[i][j-1]!='C'){
            s[i][j]='C'; c--;
        }
        for(int i=25;i<49;i+=2)
        for(int j=1;j<24;j++)
        if(b>0&&s[i-1][j]!='B'&&s[i+1][j]!='B'&&s[i][j+1]!='B'&&s[i][j-1]!='B'){
            s[i][j]='B'; b--;
        }
        printf("50 50\n");
        for(int i=0;i<50;i++)
        {
            printf("%s\n",s[i]);
        }
    }
    return 0;
}

这次比赛又是1道题惨掉分,提醒着我,能暴力就暴力,不要贪模拟和公式。。。还有细节必须注意。。。

希望下次不要再掉分了哇!!!

猜你喜欢

转载自blog.csdn.net/lsd20164388/article/details/80660687