题意:给定一个长度为3n的01串,串的价值为0块的个数和1块的个数和,比如010的价值为3,0010的价值也为3,01010的价值为5,你可以进行一种操作,把相邻俩个元素从0变成1或者从1变成0,要在n次操作内使串的价值达到2n或以上,输出操作数和每个操作的左边位置
题目链接
#include<stdio.h>
#include<string.h>
char s[300100];
int a[300100];
int ans[100100];
void change(int now){
if(a[now]==0)a[now]=1;
else a[now]=0;
}
int main(){
scanf("%s",s+1);
int cnt=strlen(s+1);
int cnta=0;
for(int i=1;i<=cnt;i++)a[i]=s[i]-‘0‘;
for(int i=1;i<=cnt;i=i+3){
if(a[i]==0&&a[i+1]==1&&a[i+2]==0)continue;
if(a[i]==1&&a[i+1]==0&&a[i+2]==1)continue;
if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
if((a[i-1]^a[i])==0){
ans[++cnta]=i;
change(i);
change(i+1);
}
else{
ans[++cnta]=i+1;
change(i+1);
change(i+2);
}
}
else{
if(a[i]!=a[i+1]){
ans[++cnta]=i;
change(i);
change(i+1);
}
else{
ans[++cnta]=i+1;
change(i+1);
change(i+2);
}
}
}
printf("%d\n",cnta);
for(int i=1;i<=cnta;i++){
printf("%d",ans[i]);
if(i==cnta)printf("\n");
else printf(" ");
}
}
原文:https://www.cnblogs.com/League-of-cryer/p/14017913.html