Codeforces Round #640 (Div. 4) 参与排名人数9749,终于弄明白账号前*的意义,*out of competition,也即虽然该用户参加本场比赛,但不参与排名。
[codeforces 1352F] Binary String Reconstruction 先处理00,再处理11,最后处理(01或10)
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1352/problem/F
| Problem | Lang | Verdict | Time | Memory |
|---|---|---|---|---|
| F - Binary String Reconstruction | GNU C++17 | Accepted | 15 ms | 3600 KB |
样例模拟如下
1 3 5
1对0,5对1,3对(01或10)
先构造,1对0,5对1,
0011111请注意,此时,已经减少了1对(01或10)
继续构造剩下的2对(01或10)
001111101
1 1 1
1对0,1对1,1对(01或10)
先构造,1对0,1对1,
0011请注意,此时,已经减少了1对(01或10)
继续构造剩下的0对(01或10)
0011
3 9 3
3对0,3对1,9对(01或10)
先构造,3对0,3对1,
00001111请注意,此时,已经减少了1对(01或10)
继续构造剩下的8对(01或10)
0000111101010101
0 1 0
0对0,0对1,1对(01或10)
构造01
3 1 2
3对0,2对1,1对(01或10)
先构造,3对0,2对1,
0000111请注意,此时,已经减少了1对(01或10)
继续构造剩下的0对(01或10)
0000111
0 0 3
0对0,3对1,0对(01或10)
先构造,3对1,
1111
2 0 0
2对0,0对1,0对(01或10)
先构造,2对0,
000
AC代码如下
#include <stdio.h>
#include <string.h>
char s[400];
int main(){
int t,a,b,c,i,len;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&c);
len=0;
if(a>0){//先处理a对00
for(i=0;i<=a;i++)s[i]='0';
len=a+1;
}
if(c>0){//再处理c对11
if(len>0)b--;//要判定开始11类型时,之前的字母是否是0.len>0,之前字母是0
for(i=len;i<=len+c;i++)s[i]='1';
len=len+c+1;
}
if(b>0){//最后处理b对(01或10)
if(len==0){//当前字串长度是0.1对(01或10)形态:01; 2对 010; 3对 0101; 4对 01010
s[0]='0';
for(i=1;i<=b;i++)
if(i%2)s[i]='1';
else s[i]='0';
len=b+1;
}
else if(s[len-1]=='1'){//前面是1.1对(01或10)形态:0; 2对:01; 3对:010; 4对:0101
for(i=len;i<len+b;i++)
if((i-len)%2==0)s[i]='0';
else s[i]='1';
len=len+b;
}else if(s[len-1]=='0'){//前面是0.1对(01或10)形态:1; 2对:10; 3对:101
for(i=len;i<len+b;i++)
if((i-len)%2==0)s[i]='1';
else s[i]='0';
len=len+b;
}
}
s[len]='\0';
printf("%s\n",s);
}
return 0;
}

被折叠的 条评论
为什么被折叠?



