POJ T3617 Best Cow Line
阿新 • • 發佈:2018-12-09
題意:
簡單理解就是,給你一串字串(雖然是一行一個輸入),有兩種操作,分別是從首或者尾取出一個字元,放到新串中,要求新串是在兩種操作下的字典序最小的字串。
題解:
貪心,比較首部和尾部哪個比較小取哪個。如果一樣大,首部指標往後移,尾部指標往前移,直到不相等或者不能再移動為止。因為,這樣才能讓較小的字元儘早地輸出。
例:原串:ADSFVA (首部和尾部相同,但是D比V小,所以讓首部的A先輸出,讓D儘早地輸出)
程式碼:
#include<cstdio> #include<iostream> using namespace std; const int MAXN = 2005; int n; char s[MAXN]; void lest_lex(){ int cnt = 0; int a = 0; int b = n-1; while(a <= b){ bool left = false; for(int i = 0;a + i <= b - i;++i){ if(s[a+i] < s[b-i]){ left = true; break; } if(s[a+i] > s[b-i]){ left = false; break; } } if(left) printf("%c",s[a++]); else printf("%c",s[b--]); cnt++; if(cnt % 80 == 0) printf("\n"); } } int main(){ while(~scanf("%d",&n)){ for(int i = 0; i < n ;++i) scanf("\n%c",&s[i]); lest_lex(); } }