字典序最小问题 (贪心)

输入:

n=6

S="ACDBCB"

输出:

ABCBCD

 

不断取S的开头和末尾中较小的一个字符放到T的末尾

1.按照字典序比较S和将S反转后的字符串'S'.

2.如果S较小,就从S的开头取出一个文字,追加到T的末尾.

3.如果S较小,就从S的末尾取出一个文字,追加到T的末尾.

 

 1 const int MAX_N=100000;
 2 
 3 int N;
 4 char S[MAX_N];
 5 
 6 void solve()
 7 {
 8     int a=0,b=N-1;
 9     while(a<=b){
10         //将从左起和右起的字符串比较
11         bool left=false;
12         for(int i=0; a+i<=b; i++){
13             if(S[a+i]<S[b-i]){
14                 left=true;
15                 break;
16             }
17             else if(S[a+i]>S[b-i]){
18                 left=false;
19                 break;
20             }
21         }
22         if(left)   putchar(S[a++]);
23         else   putchar(S[b--]);
24     }
25 }

 

 

 

 

 

 

<<挑战程序设计竞赛>>读后感

posted @ 2016-02-29 10:07  Vmetrio  阅读(202)  评论(0编辑  收藏  举报