【挑战】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 }

浙公网安备 33010602011771号