BZOJ 1640/1692 : [Usaco2007 Nov]Best Cow Line 队列变换 (贪心)

1640: [Usaco2007 Nov]Best Cow Line 队列变换

Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 710  Solved: 373 [Submit][Status][Discuss]

Description

FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of every cow),举个例子,FJ带了Bessie, Sylvia,和Dora,那么就可以缩写为BSD. FJ只需将奶牛的一个序列重新排列,然后参加比赛.他可以让序列中的第一头奶牛,或者最后一头走出来,站到新队列的队尾. 利欲熏心的FJ为了取得冠军,他就必须使新队列的字典序尽量小. 给你初始奶牛序列(用头字母)表示,然后按照上述的规则组成新序列,并使新序列的字典序尽量小.

Input

第1行:一个整数N.

第2行至第N+1行:每行一个大写字母,表示初始序列中该奶牛的头字母.

Output

得到的最小字典序的序列.每输出80个字母需要一个换行!

Sample Input

6 A C D B C B

Sample Output

ABCBCD

HINT

Source

Silver

思路:比较麻烦的一个贪心。。对拍才找出了一个错误。。。

写丑了QAQ

  1/* ***********************************************
  2Author :111qqz
  3Created Time :2016年04月08日 星期五 16时16分34秒
  4File Name :code/bzoj/1640.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <set>
 14#include <map>
 15#include <string>
 16#include <cmath>
 17#include <cstdlib>
 18#include <ctime>
 19#define fst first
 20#define sec second
 21#define lson l,m,rt<<1
 22#define rson m+1,r,rt<<1|1
 23#define ms(a,x) memset(a,x,sizeof(a))
 24typedef long long LL;
 25#define pi pair < int ,int >
 26#define MP make_pair
 27
 28using namespace std;
 29const double eps = 1E-8;
 30const int dx4[4]={1,0,0,-1};
 31const int dy4[4]={0,-1,1,0};
 32const int inf = 0x3f3f3f3f;
 33const int N=2E3+7;
 34int n;
 35int a[N];
 36string ans;
 37int main()
 38{
 39	#ifndef  ONLINE_JUDGE 
 40	freopen("code/in.txt","r",stdin);
 41  #endif
 42
 43	ios::sync_with_stdio(false);
 44	cin>>n;
 45	ans ="";
 46	for ( int i = 1 ;i <= n ; i++)
 47	{
 48	    char ch;
 49	    cin>>ch;
 50	    a[i] = ch-'A'+1;
 51	}
 52
 53	int l = 1;
 54	int r = n ;
 55
 56	while (l<=r)
 57	{
 58	    if (l==r)
 59	    {
 60	//	cout<<"aans:"<<ans<<endl;
 61		ans += char(a[l]+64);
 62	//	cout<<"aaans:"<<ans<<endl;
 63
 64		break;
 65	    }
 66	    if (a[l]!=a[r])
 67	    {
 68		if (a[l]<a[r])
 69		{
 70		    ans += char(a[l]+64);
 71		    l++;
 72		}
 73		else
 74		{
 75		    ans += char(a[r]+64);
 76		    r--;
 77		}
 78	    }
 79	    else
 80	    {
 81		if (l==r) continue;
 82		int tmpl = l;
 83		int tmpr = r;
 84		while (a[tmpl]==a[tmpr]&&tmpl<tmpr)
 85		{
 86		    tmpl++;
 87		    tmpr--;
 88		}
 89//		cout<<"tmpl:"<<tmpl<<" tmpr:"<<tmpr<<" ans:"<<ans<<endl;	
 90		if (tmpl>=tmpr)
 91		{
 92		    while (l<=r)
 93		    {
 94	//		cout<<"l:"<<l<<" r:"<<r<<" ans:"<<ans<<endl;
 95
 96
 97			if (a[l]<=a[r])
 98			{
 99			    ans += char(a[l]+64);
100			    l++;
101			    break;
102			}
103			else
104			{
105			    ans += char(a[r]+64);
106			    r--;
107			    break;
108			}
109			//cout<<" ans:"<<ans<<endl;
110		    }
111		 /*   for ( int i = l ;  i <= r ; i++)
112		    {
113			if (tmpl==tmpr&&a[tmpl]>a[l]&&i==tmpl) continue;
114			ans +=char(a[i]+64);
115		    }
116		    if (tmpl==tmpr&&a[tmpl]>a[l]) ans += char(a[tmpl]+64); */
117		    //break;
118		}
119		else
120		{
121		    while (l<tmpl&&r>tmpr)
122		    {
123	//		cout<<"l:"<<l<<" r:"<<r<<" anssss:"<<ans<<endl;
124
125			if (a[l]==a[r])
126			{
127			    if (a[tmpl]<=a[tmpr])
128			    {
129				ans += char(a[l]+64);
130				l++;
131				break;
132			    }else
133			    {
134				ans += char(a[r]+64);
135				r--;
136				break;
137			    }
138
139			}
140			else
141			{
142
143			    if (a[l]<a[r])
144			    {
145				ans+=char(a[l]+64);
146				l++;
147				break;
148			    }
149			    else 
150			    {
151				ans+=char(a[r]+64);
152				r--;
153				break;
154			    }
155			 //   cout<<"l:"<<l<<" r:"<<r<<" anssss:"<<ans<<endl;    
156			}
157		    }
158			/*   if (a[tmpl]<a[tmpr])
159		    {
160			for ( int i = l ; i <= tmpl ; i++) ans +=char(a[i]+64);
161			l = tmpl+1;
162		    }
163		    else
164		    {
165			for ( int i = r ; i >= tmpr ; i--) ans +=char(a[i]+64);
166			r = tmpr-1;
167		    }   */
168		}
169	    }
170	   // cout<<"l:"<<l<<" r:"<<r<<" ans:"<<ans<<endl;
171
172	}
173	int len = ans.length();
174	for ( int i = 0 ; i < len ; i++)
175	{
176	    cout<<ans[i];
177	    if ((i+1)==0) cout<<endl;
178	}
179//	cout<<ans<<endl;
180  #ifndef ONLINE_JUDGE  
181  fclose(stdin);
182  #endif
183    return 0;
184}
185
186
187
188
189
190
191
192出错数据:
193input:
194393
195A
196C
197A
198A
199B
200C
201C
202C
203C
204B
205B
206C
207A
208C
209C
210C
211B
212B
213A
214C
215C
216B
217C
218C
219C
220C
221A
222A
223A
224A
225C
226A
227A
228A
229B
230C
231C
232C
233B
234A
235A
236B
237A
238A
239B
240C
241C
242C
243A
244A
245C
246A
247C
248A
249C
250B
251C
252C
253B
254A
255A
256B
257C
258B
259B
260A
261B
262B
263C
264A
265B
266A
267B
268B
269B
270B
271B
272B
273A
274B
275A
276B
277A
278C
279B
280A
281B
282B
283B
284A
285B
286C
287C
288A
289B
290B
291C
292C
293A
294B
295C
296C
297A
298C
299C
300B
301A
302A
303A
304A
305A
306A
307B
308A
309A
310A
311B
312C
313B
314C
315A
316A
317C
318A
319B
320A
321B
322A
323C
324C
325A
326C
327C
328A
329B
330C
331C
332B
333C
334C
335A
336A
337B
338C
339B
340B
341A
342A
343B
344B
345A
346B
347C
348C
349C
350C
351A
352C
353A
354A
355B
356A
357A
358B
359B
360B
361A
362A
363A
364B
365B
366B
367B
368C
369A
370A
371B
372B
373B
374A
375A
376B
377B
378A
379C
380C
381C
382C
383B
384A
385A
386A
387B
388A
389C
390B
391B
392A
393C
394C
395B
396A
397A
398B
399A
400C
401C
402C
403A
404A
405C
406B
407C
408C
409C
410B
411B
412C
413B
414C
415A
416B
417C
418A
419C
420C
421B
422A
423A
424A
425B
426C
427C
428C
429B
430C
431B
432A
433A
434C
435B
436C
437A
438C
439B
440A
441A
442C
443B
444B
445C
446B
447A
448A
449C
450C
451C
452A
453B
454A
455C
456A
457B
458B
459C
460C
461B
462C
463B
464B
465B
466A
467C
468C
469C
470A
471B
472A
473B
474C
475C
476B
477B
478A
479B
480B
481A
482C
483C
484C
485C
486B
487C
488A
489A
490A
491A
492A
493C
494C
495C
496B
497C
498B
499A
500C
501A
502B
503A
504C
505B
506C
507A
508A
509A
510A
511C
512C
513C
514B
515B
516B
517B
518C
519C
520B
521A
522A
523C
524C
525C
526A
527A
528C
529B
530B
531B
532C
533B
534C
535B
536C
537C
538A
539A
540C
541A
542C
543C
544C
545C
546B
547A
548A
549B
550A
551C
552B
553B
554C
555B
556B
557C
558B
559B
560B
561C
562A
563C
564B
565A
566B
567B
568C
569C
570B
571C
572C
573C
574A
575C
576B
577C
578B
579B
580A
581B
582B
583C
584B
585A
586A
587C
588
589我的输出:ACAABCBBABBCAABCBCACCCBCCBBABCACBBBCBBCBBCABAABCCCCACAACCBCBCBBBCAACCCAABCCBBBBC
590CCAAAACBCABACABCBCCCAAAAACBCCCCABBABBCCBABACCCABBBCBCCBBACABACCCAABCBBCAABCACBCA
591ABCBCCCBAAABCCACBACBCBBCCCBCAACCCABAABCCABBCABAAABCCCCABBAABBBAACBBBBAAABBBAABAA
592CACCCCBABBAABBCBAACCBCCBACCACCABABACAACBCBAAABAAAAAABCCACCBACCBBACCBABBBABCABABA
593BBBBBBABACBBABBCBAABCCBCACACAACCCBAABAABCCCBAAACAAAACCCCBBCACCCBBACCBCCCC
594
595正确输出:ACAABCAABCBBABBCBCACCCBCCBBABCACBBBCBBCBBCABAABCCCCACAACCBCBCBBBCAACCCAABCCBBBBC
596CCAAAACBCABACABCBCCCAAAAACBCCCCABBABBCCBABACCCABBBCBCCBBACABACCCAABCBBCAABCACBCA
597ABCBCCCBAAABCCACBACBCBBCCCBCAACCCABAABCCABBCABAAABCCCCABBAABBBAACBBBBAAABBBAABAA
598CACCCCBABBAABBCBAACCBCCBACCACCABABACAACBCBAAABAAAAAABCCACCBACCBBACCBABBBABCABABA
599BBBBBBABACBBABBCBAABCCBCACACAACCCBAABAABCCCBAAACAAAACCCCBBCACCCBBACCBCCCC