【挑战】POJ3617 贪心

 

44页。

一直取两端最小的字符,相等的时候要一直往里面缩直到发现应该选使得里面较小的先出来。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=2000+50;
 6 char tmp[N][2],s[N],ans[N];
 7 int main(){
 8     int n,i,j;
 9     scanf("%d",&n);
10     for(i=0;i<n;i++){
11         scanf("%s",tmp[i]);
12         s[i]=tmp[i][0];
13     }
14     //printf("%s\n",s);
15     int left=0,right=n-1,k=0;
16     while(left<right){
17         //printf("%d %d\n",left,right);
18         if(s[left]>s[right]){
19             ans[k++]=s[right--];
20         }
21         else if(s[left]<s[right]){
22             ans[k++]=s[left++];
23         }
24         else {
25             int l=left+1,r=right-1;
26             if(l>r)break;
27             while(l<r){
28                 if(s[l]!=s[r])break;
29                 l++;r--;//printf("~%d %d\n",l,r);
30             }
31             if(s[l]>s[r]){
32                 ans[k++]=s[right--];
33             }
34             else {
35                 ans[k++]=s[left++];
36             }
37 
38         }
39     }
40     if(k+2==n){
41         ans[n-2]=min(s[left],s[right]);
42         ans[n-1]=max(s[left],s[right]);
43     }
44     else ans[n-1]=s[left];
45     for(i=0;i<n;i++){
46         if(i&&i%80==0)printf("\n");
47         printf("%c",ans[i]);
48     }
49 }
View Code

 

posted @ 2017-09-18 21:15  lsy123  阅读(126)  评论(0)    收藏  举报