如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1007

来自"NOCOW"

跳转到: 导航, 搜索
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
int n, sum[2010];
string S;
 
int main()
{
    scanf("%d", &n);
    while (cin >> S)
    {
          int len = S.size(), tot = 0;
          memset(sum, 0, sizeof(sum));
          for (int i = len - 1; i >= 0; --i)
          {
              sum[i] = sum[i + 1] + (S[i] == '1');
              if (S[i] == '1') tot += i + 1;
          }
          if (len == n)
          {
             int pos = tot % (n + 1);
             if (pos) S[pos - 1] = '0';
             goto END;
          }
          else if (len < n)
               for (int i = len; i >= 0; --i)
               {
                   if ((tot + sum[i]) % (n + 1) == 0)
                      { S.insert(i, "0"); goto END; } 
                   if ((tot + (i + 1) + sum[i]) % (n + 1) == 0)
                      { S.insert(i, "1"); goto END; }
               }
          else for (int i = len - 1; i >= 0; --i)
               {
                   if (S[i] == '1' && (tot - (i + 1) - sum[i] + 1) % (n + 1) == 0)
                      { S.erase(i, 1); goto END; }
                   if (S[i] == '0' && (tot - sum[i]) % (n + 1) == 0)
                      { S.erase(i, 1); goto END; }
               }
          END : cout << S << endl;
    }
    return 0;
}
//From FingerSed
//稍稍把lx和lxx的结合起来写
//sum[i]为子串S[i~len]中1的个数


#include <iostream>
#include <cstring>
using namespace std;
char s[2010];
int n,tot,length,f[2010];
bool flag;
void insert_c(char c,int x)
{
    for (int i=n;i>x;--i)
        s[i]=s[i-1];
    s[x]=c,s[n+1]='\0';
}
void delete_c(int x)
{
    for (int i=x;i<=n;++i)
        s[i]=s[i+1];
    s[n+1]='\0';
}
void Delete()
{
    for (int i=n;i;--i)
    {
        if (flag)  break;
        if ((tot+i+f[i])%(n+1) == 0)
        {
            insert_c('1',i);
            flag=true;
        }
        else if ((tot+f[i])%(n+1) == 0)
        {
            insert_c('0',i);
            flag=true;
        }
    }
}
void Instead()
{
    for (int i=n;i;--i)
    {
        if (flag)  break;
        if (s[i] == '1')
            if ((tot-i)%(n+1) == 0)
            {
                s[i]='0';
                flag=true;
            }
    }
}
void Insert()
{
    for (int i=length;i;--i)
    {
        if (flag)  break;
        if (s[i] == '1')
        {
            if ((tot-i-f[i]+1)%(n+1) == 0)
            {
                delete_c(i);
                flag=true;
            }
        }
        else
        {
            if ((tot-f[i])%(n+1) == 0)
            {
                delete_c(i);
                flag=true;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    while (scanf("%s",&s[1]) != EOF)
    {
        tot=0,flag=false;
        memset(f,0,sizeof(f));
        length=strlen(&s[1]);
        for (int i=length;i;--i)
        {
            f[i]=f[i+1];
            if (s[i] == '1')  ++f[i];
        }
        for (int i=1;i<=length;++i)
            if (s[i] == '1')
                tot+=i;
        if (length < n)  Delete();
        else if (length == n)  Instead();
        else  Insert();
        printf("%s\n",&s[1]);
    }
    return 0;
}
//by zzy
//c++ string暴力by zhujf553
 
#include <iostream>
#include <string>
 
using namespace std;
 
int n;
 
bool count(string &s)
{
	int k = 0;
	for(int i = 1 ; i <= n ; i++)
		if(s[i - 1] == '1') k += i;
	return k % (n + 1) == 0;
}
 
void work()
{
	string s;
	cin >> n;
	while(cin >> s)
	{
		if(s.length() == n && count(s)) goto end;
		if(s.length() == n)
		for(int i = 1 ; i <= n ; i++)
		if(s[i - 1] == '1')
		{
			s[i - 1] = '0';
			if(count(s)) goto end;
			s[i - 1] = '1';
		}
		if(s.length() < n)
		for(int i = 1 ; i <= n ; i++)
		{
			s.insert(i - 1, "1");
			if(count(s)) goto end;
			s.erase(i - 1, 1);
			s.insert(i - 1, "0");
			if(count(s)) goto end;
			s.erase(i - 1, 1);
		}
		if(s.length() > n)
		for(int i = 1 ; i <= n ; i++)
		{
			string tmp = s.substr(i - 1, 1);
			s.erase(i - 1, 1);
			if(count(s)) goto end;
			s.insert(i - 1, tmp);
		}
		end:
			cout << s << endl;
	}
}
 
int main()
{
	work();
	return 0;
}
var
        str:ansistring;
        l,n:longint;
 
function getsum:longint;
var
	k,i:longint;
begin
	k:=0;
	for i:=1 to length(str) do
		if str[i]='1' then
			k:=K+i;
	getsum:=k;
end;
function get1:longint;
var
	k,i:longint;
begin
	k:=0;
	for i:=1 to length(str) do
		if str[i]='1' then
			k:=K+1;
	get1:=k;
end;
procedure work1;
var
        sum:longint;
begin
	sum:=getsum;
	sum:=(sum+(n+1)*1000) mod (n+1);
	if sum=0 then begin	writeln(str);exit; end;
	str[sum]:='0';
	writeln(str);
end;
procedure work2;
var
        sum,i,k1:longint;
begin
	sum:=getsum;
	k1:=get1;
	for i:=1 to n+1 do
		case str[i] of
			'1':
				begin
					dec(k1);
					if (sum-k1-i) mod (n+1)=0 then
						begin
							delete(str,i,1);
							writeln(str);
							exit;
						end;
				end;
			'0':
				begin
					if (sum-k1) mod (n+1)=0 then
						begin
							delete(str,i,1);
							writeln(str);
							exit;
						end;
				end;
		end;
end;
procedure work3;
var
        sum,i,k1:longint;
begin
	sum:=getsum;
	k1:=get1;
        if sum mod(n+1)=0 then begin writeln(str+'0');exit;end;
	if ((sum+length(str)+1) mod (n+1)=0) then begin writeln(str+'1');exit;end;
	for i:=1 to n-1 do
		begin
			if (sum+k1+i) mod(N+1)=0 then
				begin
					writeln(copy(str,1,i-1)+'1'+copy(str,i,length(str)-i+1));
					exit;
				end;
			if (sum+k1) mod(N+1)=0 then
				begin
					writeln(copy(str,1,i-1)+'0'+copy(str,i,length(str)-i+1));
					exit;
				end;
			if str[i]='1' then
				dec(k1);
		end;
end;
 
 
begin
{$IFNDEF ONLINE_JUDGE}
   assign(input, 'input.in');
   reset(input);
   assign(output, 'output.out');
   rewrite(output);
{$ENDIF}
	readln(n);
	while not(eof) do
		begin
			while str='' do readln(str);//Ural 喜欢搞点空行
			l:=length(str);
			if l=n then work1;
			if l>n then work2;
			if l<n then work3;
			str:='';
		end;
{$IFNDEF ONLINE_JUDGE}
   close(input);
   close(output);
{$ENDIF}
end.
//Yu Zeming
Var
 n,i:longint;
 s:ansistring;
Procedure Process1(s1:ansistring);
Var
 i,c:longint;
begin
c:=0;
 For i:=1 to n do
  If s1[i]='1'
   Then c:=c+i;
  If c mod (n+1)=0
   then writeln(s1)
   else begin
    For i:=1 to n do
     If (s1[i]='1')and((c-i) mod (n+1)=0)
      then write('0')
      else write(s1[i]);
    writeln;
   end;
end;
Procedure Process2(s1:ansistring);
Var
 A:array [1..1000] of integer;
 i,c,j,z,js:longint;
begin
 c:=0;
For i:=1 to length(s1) do
 If s1[i]='1'
  then c:=c+i;
 Fillchar(a,sizeof(a),0);
 js:=0;
For i:=length(s1) downto 1 do
 begin
  If s1[i]='1'
   then js:=js+1;
  A[i]:=js;
 end;
For i:=1 to n do
  If (c+i+A[i]) mod (n+1)=0
   then begin
    For j:=1 to i-1 do
     write(s1[j]);
     write('1');
    For j:=i to length(s1) do
     write(s1[j]);
     writeln;
     break;
    end
    else If (c+A[i]) mod (n+1)=0
    then begin
    For j:=1 to i-1 do
     write(s1[j]);
     write('0');
    For j:=i to length(s1) do
     write(s1[j]);
     writeln;
     break;
    end
end;
Procedure Process3(s1:ansistring);
var
 ss:ansistring;
 i,j,c:longint;
begin
 For i:=1 to length(s1) do
  begin
   ss:=s1;
    delete(ss,i,1);
    c:=0;
     For j:=1 to n do
      If ss[j]='1'
      then c:=c+j;
     If c mod (n+1)=0
     then begin
      writeln(ss);
      break;
     end;
  end;
end;
begin
 readln(n);
 while not(eof) do
  begin
   readln(s);
    If s=''
     then
     else begin
      If length(s)=n
       then Process1(s);
      If length(s)<n
       then Process2(s);
      If length(s)>n
       then Process3(s);
     end;
  end;
end.
 
From Xc_Zzq
var
t:ansistring;
i,j,k,n,len,s:longint;
sum:array[0..1200]of longint;
x:boolean;
procedure work1;
begin
if s mod (n+1)=0
then begin
     writeln(t);
     exit;
     end;
for i:=1 to len do
 begin
 if t[i]='1'
 then if (s-i) mod (n+1)=0
      then begin
           t[i]:='0';
           writeln(t);
           exit;
           end;
 end;
end;
 
procedure work2;
begin
for i:=1 to len+1 do
 begin
 j:=sum[len]-sum[i-1];
 if (s+j) mod (n+1)=0
 then begin
      insert('0',t,i);
      writeln(T);
      exit;
      end;
 if (s+j+i) mod (n+1)=0
 then begin
      insert('1',t,i);
      writeln(T);
      exit;
      end;
 end;
end;
 
procedure work3;
begin
for i:=1 to len do
 begin
 j:=sum[len]-sum[i];
 if t[i]='0'
 then begin
      if (s-j) mod (n+1)=0
      then begin
           delete(t,i,1);
           writeln(T);
           exit;
           end;
      end
 else begin
      if (s-j-i) mod (n+1)=0
      then begin
           delete(t,i,1);
           writeln(t);
           exit;
           end;
      end;
 end;
end;
 
begin
readln(n);
while not(eof) do
 begin
 readln(t);
 if t=''
 then continue;
 sum[0]:=0;
 s:=0;
 len:=length(T);
 for i:=1 to len do
 if t[i]='1'
 then begin
      sum[i]:=sum[i-1]+1;
      inc(s,i);
      end
 else sum[i]:=sum[i-1];
 if length(t)=n-1
 then work2
 else if length(t)=n
      then work1
      else work3;
 end;
end.
 
from zlq
var
 bo:boolean;
 n,sum:longint;
 f:array[1..2000]of longint;
 s:ansistring;
function judge(s:ansistring):boolean;
var
 i,sum:longint;
begin
 sum:=0;
 if length(s)<>n then exit(false);
 for i:=1 to length(s) do
  if s[i]='1' then inc(sum,i);
 if sum mod (n+1)=0 then exit(true);
 if sum=0 then exit(true);
 exit(false);
end;
 
procedure deal(s:ansistring);
var
 i,x:longint;
 sx:ansistring;
begin
 x:=length(s);
 if n=x
 then for i:=1 to n
      do if ((sum-i) mod (n+1)=0)and(s[i]='1')
         then begin
              writeln(copy(s,1,i-1),'0',copy(s,i+1,length(s)-i));
              exit;
              end;
 if x>n
 then for i:=1 to x
      do if (((sum-i-f[i]+1) mod (n+1)=0)and(s[i]='1'))
            or(((sum-f[i]) mod (n+1)=0)and(s[i]='0'))
         then begin
              writeln(copy(s,1,i-1),copy(s,i+1,length(s)-i));
              exit;
              end;
 if x<n
 then begin
      if sum mod (n+1)=0
      then begin
           writeln(s,'0');
           exit;
           end;
      if (sum+n) mod (n+1)=0
      then begin
           writeln(s,'1');
           exit;
           end;
      for i:=1 to x
      do begin
         if (sum+f[i]) mod (n+1)=0
         then begin
              writeln(copy(s,1,i-1),'0',copy(s,i,length(s)-i+1));
              exit;
              end;
         if (sum+f[i]+i) mod (n+1)=0
         then begin
              writeln(copy(s,1,i-1),'1',copy(s,i,length(s)-i+1));
              exit;
              end;
      end;
      end;
end;
 
procedure dealwith(var s:ansistring);
var
 i:longint;
begin
 fillchar(f,sizeof(f),0);
 sum:=0;
 i:=0;
 repeat
  inc(i);
  if s[i]=' '
  then begin
       delete(s,i,1);
       dec(i);
       end;
 until i>=length(s);
 for i:=length(s) downto 1 do
  if s[i]='1' then begin
                   inc(sum,i);
                   f[i]:=f[i+1]+1;
                   end
  else f[i]:=f[i+1];
end;
 
begin
 readln(n);
 repeat
   bo:=false;
   readln(s);
   if length(s)>0 then
   dealwith(s);
   if length(s)>0 then
   begin
   if judge(s)
   then writeln(s)
   else deal(s);
   end;
 until eof;
end.
 
from churchill
个人工具