http://acm.timus.ru/problem.aspx?space=1&num=1008
题意:一个01信号串在经过某通道的时候会有如下几种可能的变化
(1)不变
(2)一个(仅一个)0变成1
(3)在某个位置删掉一个(仅一个)符号
(4)在某个位置增加一个(仅一个)符号
并且原信号串必须满足 符号为1的位置和 模 (len+1) 为 0。
例如1010,符号为1的位置有1和3,加起来等于4,模len+1=5的结果不是0,所以不可能是原信号串。
现在给原信号串的长度和变化后的信号串,求原信号串。
题解:
没什么需要说的,这题就是模拟题,细心点就能1A。
直接上程序
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
int a[2100];
void do2(int n, int ret){
for (int i=1; i<=n; i++)
if (a[i]==1) if ((ret-i)%(n+1)==0){
a[i]=0;
break;
}
for (int i=1; i<=n; i++) printf("%d", a[i]);
}
void do3(int n){
int ret, ans=0;
for (int i=1; i<=n+1; i++){
ret=0;
for (int j=1, k=1; j<=n; k++){
if (k==i) continue;
if (a[k]==1) ret+=j;
j++;
}
if (ret%(n+1)==0){
ans=i;
break;
}
}
for (int i=1; i<=n+1; i++)
if (i!=ans) printf("%d", a[i]);
}
void do4(int n){
int ret, ans=0, p;
for (int i=1; i<=n; i++){
ret=0;
for (int j=1; j<n; j++)
if (a[j]==1) if (j>=i) ret+=j+1; else ret+=j;
if (ret%(n+1)==0){
ans=i;
p=0;
break;
}
ret+=i;
if (ret%(n+1)==0){
ans=i;
p=1;
break;
}
}
for (int i=1; i<ans; i++) printf("%d", a[i]);
printf("%d", p);
for (int i=ans; i<n; i++) printf("%d", a[i]);
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int n;
scanf("%d", &n);
string c;
while (cin>>c){
int len=c.length(), ret=0;
for (int i=0; i<len; i++){
a[i+1]=c[i]-'0';
if (a[i+1]==1) ret+=i+1;
}
if (len<n) do4(n);
if (len>n) do3(n);
if (len==n){
if (ret%(n+1)==0)
for (int i=1; i<=n; i++) printf("%d", a[i]);
else do2(n, ret);
}
printf("\n");
}
return 0;
}