刷題 藍橋杯 BASIC 19 完美的代價

2021-10-02 21:30:22 字數 1259 閱讀 6816

回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。

交換的定義是:交換兩個相鄰的字元

例如mamad

第一次交換 ad : mamda

第二次交換 md : madma

第三次交換 ma : madam (回文!完美!)

第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)

第二行是乙個字串,長度為n.只包含小寫字母

如果可能,輸出最少的交換次數。

否則輸出impossible

#include

using

namespace std;

intmain()

flag =1;

cnt +

= n /

2- i;

//該字元交換到適宜位置需要的次數

}else

if(s[k]

== s[i]

) j--

;//對應字元完成歸位,匹配範圍內縮

break;}

}}cout << cnt;

return0;

}

這個解法中,字串從頭開始,固定左側的每乙個可成對的字元,將對應字元移動到右側的相應位置。

若字串為奇數個字元,則其中應有乙個字元沒有"配偶",這個字元應當置於中心。但若直接將之交換並記錄次數

會使計數比最小的交換次數多1,比如 bdaabcc 這個字串,若交換了d則在歸位a時會產生額外的一次交換

因此對於這個字元不進行直接的交換操作,而是預設在完全歸位後對其進行交換

而此時也同樣不必進行交換累計,直接根據其所在位置使用公式來進行計算交換次數累計到cnt中即可

(由於對實際累計沒有影響,所以在過程中就進行計算,等效於完全歸位後計算,也便於impossible的判斷)

關於貪心:

貪心法是求解一類問題最優化的方法,它總是考慮在當前狀態下區域性最優(或較優)的策略,來使全域性的結果達到最優或較優的狀態。

顯然,如果採取較優而非最優策略,得到的全域性結果也無法是最優的。而要獲得最優結果,則要求中間的每步策略則是最優的。因此

嚴謹採用貪心法來解決最優化問題需要對採取的策略進行證明。證明的一般思路時採取反證法或數學歸納法,即假設策略不能導致

最優解,然後通過一系列推導來得到矛盾,以此證明策略是最優的,最後使用數學歸納法保證全域性最優。 (演算法筆記)

藍橋杯 Basic19 完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...

藍橋杯BASIC 19 完美的代價

csdn富文字編輯器測試,這樣子似乎沒有markdown好看欸 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回...

藍橋Basic19完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...