貪心 字典序最小問題

2021-08-28 04:20:51 字數 866 閱讀 1869

#貪心 字典序最小問題

題目大意:給你乙個長為n的字串s,並提供下列2種操作

讓你構造出字典序最小的字串t

###思路

因為每次我們能直接考慮的只有s的首尾字母,所以每次新增到t中的不是第乙個就是最後那乙個,沒有別的方法,並且都是新增到t的末尾

根據字典序的定義,越靠前的字母越小,則字典序越小,所以我們每次盡量先把更小的字母加到t的靠前位置,這個策略比較直觀。

不過當s的首位相同時,該如何選擇呢?隨便選擇乙個?肯定不可以,這個是有反例的

比如cdbc,如果我們選擇首字母,則得到的答案會是ccbd,而不是最優解cbcd

不過這個問題其實很好解決,當s的兩端s[0]與s[n]相同,則我們可以假裝把這兩個字母忽略掉,然後剩下的s[1]到s[n-1]就形成了乙個新的字串,此時我們對這個字串繼續之前的策略,哪邊更小我們原串就選擇哪邊

所以總結一下,我們可以這樣說:

我們比較s和將s反轉後的s』的字典序大小

1. s < s』我們選擇首字母

2. s > s』我們選擇尾字母

#include

using

namespace std;

char s[

1005];

int n;

intmain()

int l =

0, r = n -1;

while

(l <= r)

else

if(s[l]

< s[r])}

if(lt)

else

}return0;

}

字典序最小問題(貪心)

題目大意 輸入n,代表有乙個長度為n的字串。起初,t是乙個空串,隨後反覆進行下列任意操作 從s 的頭部刪除乙個字元,加入到t的尾部 從s的尾部刪除乙個字元,加入到t的尾部 目的是構造字典序盡可能小的字串t 限制條件 1 n 2000,每個字串只包含大寫字母 思路 這題主要要知道當前後一樣時該選哪個,...

字典序最小問題 貪心

輸入 n 6s acdbcb 輸出 abcbcd 不斷取s的開頭和末尾中較小的乙個字元放到t的末尾 1.按照字典序比較s和將s反轉後的字串 s 2.如果s較小,就從s的開頭取出乙個文字,追加到t的末尾.3.如果s較小,就從s的末尾取出乙個文字,追加到t的末尾.1 const int max n 10...

字典序最小問題

給定長度為n的字串s,要構造乙個長度為n的字串t。起初,t 是乙個空串,隨後反覆進行下列 任意 操作。1 從 s 的頭部 刪除乙個 字元,加到 t的 尾部 2 從 s 的尾部 刪除乙個 字元,加到 t 的 尾部 你的 目標是 要構造字典序盡可能小的字串 t。s 只包含大寫英文本母 輸入10 asdf...