算法:模拟
这到题怎么说呢,感觉是它的题意叙述不是特别清楚,最后要求的答案很容易让人误以为是一道搜索题,其实是一道很裸的模拟题。
这到题怎么说呢,感觉是它的题意叙述不是特别清楚,最后要求的答案很容易让人误以为是一道搜索题,其实是一道很裸的模拟题。
每次做的时候,我们只做一种操作(一开始我以为四种操作都做一遍直到满足情况……)。如果长度相等就做操作1,如果长度大于标准长度那么一定需要删掉什么东西,就做操作2,否则一定需要添加什么东西,就做操作3。
program word;
var
s:ansistring;
l,n:longint;
function getsum:longint;{统计位置和。}
var
k,i:longint;
begin
k:=0;
for i:=1 to length(s) do if s[i]='1' then k:=k+i;
getsum:=k;
end;
function get1:longint;{统计1的个数。}
var
k,i:longint;
begin
k:=0;
for i:=1 to length(s) do if s[i]='1' then k:=k+1;
get1:=k;
end;
procedure work1;
var
sum:longint;
begin
sum:=getsum;
sum:=sum mod (n+1);
if sum=0 then
begin
writeln(s);
exit;
end;
if (s[sum]='0') then{这一位就是多出来的那一位,如果是0的话就表示发生了错误。}
begin
writeln(-1);
exit;
end;
s[sum]:='0';
writeln(s);
end;
procedure work2;
var
sum,i,k1:longint;
begin
sum:=getsum;
k1:=get1;
for i:=1 to n+1 do
begin
case s[i] of
'1':begin
dec(k1);
if (sum-k1-i) mod (n+1)=0 then{如果删掉一个数,那么所有有1的位置都会减少1,位置和因此而减少k1,因此需要再减个k1。}
begin
delete(s,i,1);
writeln(s);
exit;
end;
end;
'0':begin
if (sum-k1) mod (n+1)=0 then{同上。}
begin
delete(s,i,1);
writeln(s);
exit;
end;
end;
end;{case}
end;
writeln(-1);
end;
procedure work3;
var
sum,i,k1:longint;
begin
sum:=getsum;
k1:=get1;
if sum mod (n+1)=0 then
begin
writeln(s+'0');
exit;
end;
if ((sum+length(s)+1) mod (n+1)=0) then{同理。}
begin
writeln(s+'1');
exit;
end;
for i:=1 to n-1 do
begin
if (sum+k1) mod (N+1)=0 then
begin
writeln(copy(s,1,i-1)+'0'+copy(s,i,length(s)-i+1));
exit;
end;
if (sum+k1+i) mod (N+1)=0 then
begin
writeln(copy(s,1,i-1)+'1'+copy(s,i,length(s)-i+1));
exit;
end;
if s[i]='1' then dec(k1);
end;
writeln(-1);
end;
begin
assign(input,'word.in'); reset(input);
assign(output,'word.out'); rewrite(output);
readln(n);
while not eof do
begin
while s='' do readln(s);
l:=length(s);
if l=n then work1;
if l>n then work2;
if l<n then work3;
s:='';
end;
close(input); close(output);
end.