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 }