字典序最小問題(POJ3617)

2021-09-28 20:53:43 字數 844 閱讀 3713

題目大意:給定長度為n的字串s,要構造乙個長度為n的字串t。起初,t是乙個空串,隨後反覆進行下列任意操作。

從s的頭部刪除乙個字元,加到t的尾部

從s的尾部刪除乙個字元,加到t的尾部

目標是構造字典序盡可能小的字串。

輸入:6

acdbcb

輸出abcbcd

解題思路:

這道題我們很容易想到,不斷取開頭或者結尾最小的乙個字母放到t中就可以了。這個思路是正確的,不過我們要針對開頭和結尾相同的情況來進行一下判斷,便得到如下演算法:

1.按照字典序比較s和將s反轉後的字串

2.如果s較小,就從s的開頭取出乙個字元

3.如果s』較小,就從s的末尾取出乙個字元

ac**:

#include

#include

#include

using namespace std;

const

int n =

1e5+10;

char s[n+1]

;int n;

void

solve()

else

if(s[a+i]

>s[b-i])}

if(left)

putchar

(s[a++])

;else

putchar

(s[b--])

;}putchar

('\n');

}int

main()

所以說,字典序比較類的問題,經常能用的到貪心演算法。

poj3617字典序最小問題 貪心

題目大意 給定長度為n的字串s,要構造乙個長度為n的字串t。構造方法為 從s頭部刪除乙個字元,加到t的尾部 從s尾部刪除乙個字元,加到t的尾部 解題思路 是一道貪心的水題,但也有值得學習的地方。程式設計技巧上,使用的方法比較獨特,每次都要搜尋一次,時間複雜度會高一點,但這道題怎麼寫肯定都不會超時,所...

poj 3617字典序最小 貪心

思路 定義乙個標記位left 表示是否輸出的左邊的字元 逐個比較首尾 0與n比 1與n 1比較 2與n 2比較.每當滿足比較條件 即兩個字元不相同,一大一小 就給標記位標記上,最後根據標記位的值進行輸出,切記每行滿80字元要換行 pe所在 ac include include include inc...

貪心專練2 最小字典序排序POJ3617

題目大意 給定長度為n的字串s,要構造乙個長度為n的字串t。起初,t是乙個空串,隨後反覆進行下列任意操作。從s的頭部刪除乙個字元,加到t的尾部 從s的尾部刪除乙個字元,加到t的尾部 目標是構造字典序盡可能小的字串。input 6 acdbcb output abcbcd 思路 最優規則 1.不斷比較...