CDQZ_Training 20120524 词编码

http://cdqz.openjudge.cn/noip/1009/

时间限制:
10000ms
内存限制:
128000kB
描述
输入
N和转换后的单词,每个单词占一行。单词数不大于2001.不会有其它任何东西,除了一些空格与空行
输出
你的程序应该打印输出原始序列的词,注意换行。
若有多解,操作4优先,不行则按操作1,2,3优先。同一操作,按操作位置最先的优先。同一操作,按操作位置最先的优先(从左到右数起l,2,3,…N),还有操作2时,被删数列,先在被删数列添0,不行再添l。
如果没答案输出-1
样例输入
4
0000
011
1011
11011
样例输出
0000
0110
1001
1111
 
题解:
  这道题是URAL1007的原题,直接模拟即可。在几个需要移动的操作用前缀和优化即可。
 
View Code
  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 
  5 using namespace std;
  6 
  7 const int maxn=2000;
  8 
  9 int n,num[maxn];
 10 
 11 char s[maxn];
 12 
 13 bool check1(char *s)
 14 {
 15     int l=strlen(s+1);
 16     if (l!=n) return false;
 17     int sum=0;
 18     for (int a=1;a<=n;a++)
 19         if (s[a]=='1') sum+=a;
 20     for (int a=1;a<=n;a++)
 21     {
 22         if (s[a]=='1')
 23         {
 24             sum-=a;
 25             if (sum % (n+1)==0)
 26             {
 27                 s[a]='0';
 28                 printf("%s\n",s+1);
 29                 return true;
 30             }
 31             sum+=a;
 32         }
 33     }
 34     return false;
 35 }
 36 
 37 bool check2(char *s)
 38 {
 39     int l=strlen(s+1);
 40     if (l!=n-1) return false;
 41     int fs=0;
 42     for (int a=1;a<=l;a++)
 43     {
 44         num[a]=num[a-1];
 45         if (s[a]=='1') num[a]++,fs+=a;
 46     }
 47     for (int a=1;a<=n;a++)
 48     {
 49         fs+=num[l]-num[a-1];
 50         if (fs % (n+1)==0)
 51         {
 52             for (int b=1;b<a;b++)
 53                 printf("%c",s[b]);
 54             printf("0");
 55             for (int b=a;b<=l;b++)
 56                 printf("%c",s[b]);
 57             printf("\n");
 58             return true;
 59         }
 60         fs+=a;
 61         if (fs % (n+1)==0)
 62         {
 63             for (int b=1;b<a;b++)
 64                 printf("%c",s[b]);
 65             printf("1");
 66             for (int b=a;b<=l;b++)
 67                 printf("%c",s[b]);
 68             printf("\n");
 69             return true;
 70         }
 71         fs-=a+num[l]-num[a-1];
 72     }
 73     return false;
 74 }
 75 
 76 bool check3(char *s)
 77 {
 78     int l=strlen(s+1);
 79     if (l!=n+1) return false;
 80     int sum=0;
 81     for (int a=1;a<=l;a++)
 82     {
 83         num[a]=num[a-1];
 84         if (s[a]=='1') sum+=a,num[a]++;
 85     }
 86     for (int a=1;a<=l;a++)
 87     {
 88         sum-=num[l]-num[a];
 89         if (s[a]=='1') sum-=a;
 90         if (sum % (n+1)==0)
 91         {
 92             for (int b=1;b<a;b++)
 93                 printf("%c",s[b]);
 94             for (int b=a+1;b<=l;b++)
 95                 printf("%c",s[b]);
 96             printf("\n");
 97             return true;
 98         }
 99         sum+=num[l]-num[a];
100         if (s[a]=='1') sum+=a;
101     }
102     return false;
103 }
104 
105 bool check4(char *s)
106 {
107     int l=strlen(s+1);
108     if (l!=n) return false;
109     int sum=0;
110     for (int a=1;a<=l;a++)
111         if (s[a]=='1') sum+=a;
112     if (sum % (n+1)==0)
113     {
114         printf("%s\n",s+1);
115         return true;
116     }
117     return false;
118 }
119 
120 int main()
121 {
122     scanf("%d",&n);
123     while (~scanf("%s",s+1))
124     {
125         bool able=false;
126         able=check4(s);
127         if (able) continue;
128         able=check1(s);
129         if (able) continue;
130         able=check2(s);
131         if (able) continue;
132         able=check3(s);
133         if (able) continue;
134         printf("-1\n");
135     }
136 
137     return 0;
138 }
原文地址:https://www.cnblogs.com/zhonghaoxi/p/2518497.html