这次本来是稳稳的上分场。。。然后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道题惨掉分,提醒着我,能暴力就暴力,不要贪模拟和公式。。。还有细节必须注意。。。
希望下次不要再掉分了哇!!!