問題鏈接:POJ3617 Best Cow Line。
問題簡(jiǎn)述:輸入一個(gè)正整數(shù)N,再輸入N行,每行包含一個(gè)字母('A'-'Z'),將這些字母按順序構(gòu)成一個(gè)字符串S。按照以下規(guī)則取字符,順序構(gòu)成一個(gè)新的字符串T,T是按照字典順序最小的。
1.從S的頭取一個(gè)字符并且刪除該字符,連接到T中(開始時(shí)T為空串);
2.從S的尾取一個(gè)字符并且刪除該字符,連接到T中。
問題分析:這是用一個(gè)字符串構(gòu)建另外一個(gè)字符串的問題。比較S的首字符和尾字符,取其小連接到T中即可;當(dāng)首尾字符相同時(shí),則需要比較下一個(gè),盡量取下一個(gè)較小的;當(dāng)S是一個(gè)回文串時(shí),則從哪邊取字符結(jié)果都是一樣的。
程序說明:使用一個(gè)函數(shù)test()來比較哪邊更小,是一個(gè)最為有效的方法,可以使得程序邏輯更加簡(jiǎn)潔。需要注意的一點(diǎn)是,輸出時(shí),每行最多輸出80個(gè)字符,即每80個(gè)字符輸出一個(gè)換行。
AC的C++語言程序如下:
/* POJ3617 Best Cow Line */#include <iostream>using namespace std;//#define DEBUGconst int LEFT = 1;const int RIGHT = 2;const int MAXN = 2000;char a[MAXN+1];int test(char s[], int start, int end){ while(start < end) { if(s[start] < s[end]) return LEFT; else if(s[start] > s[end]) return RIGHT; start++; end--; } return LEFT;}int main(){ int n; cin >> n; for(int i=0; i<n; i++) cin >> a[i]; a[n] = '/0';#ifdef DEBUG cout << a << endl;#endif int start=0, end=n-1, count=0; for(int i=0; i<n; i++) { if(test(a, start, end) == LEFT) cout << a[start++]; else cout << a[end--]; if(++count == 80) { count = 0; cout << endl; } } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注