1. 程式人生 > 其它 >1606A - AB Balance(構造性演算法+字串+級)

1606A - AB Balance(構造性演算法+字串+級)

2021.10.29CF Round #750 (Div. 2),2021.10.30補題

1606A - AB Balance(源地址自⇔CF1606A

Problem

tag:

⇔構造性演算法、⇔字串、⇔級(*)

題意:

對於給定的只包含 \(a\)\(b\) 的字串,請你通過最少的修改次數,使得新的字串中 \(ab\)\(ba\) 的子串數量相同。輸出這個新的子串

思路:

顯然的,連續的 \(a\) 和連續的 \(b\) 交界處才有一次 \(ab\) ,連續的 \(b\) 和連續的 \(a\) 交界處才有一次 \(ba\) 。所以只要給定的字串有偶數個交界,即符合題意。所以對於奇數個交界的字串,只需要修改開始元素即可(使得交界變成偶數個)。可以證明,這種方法恆為最優的。

(附錯誤思路:如給定的字串有奇數個交界,則去尋找字串中最短的連續 \(a\) 或連續 \(b\) ,並修改這一整段。可以證明,這種方法不是最優的。)

AC程式碼:

//A WIDA Project
#include <bits/stdc++.h>
using namespace std;
long long T, num;
string s;
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> T;
    while(T -- > 0) {
    	num = 0;
		cin >> s;
		for(int i = 1; i < (int)s.size(); i ++) {
			if(s[i] != s[i - 1]) {
				num ++;
			}
		}
		if(num % 2 == 1) s[0] == 'a'? s[0] = 'b': s[0] = 'a';
		cout << s << endl;
	}
	return 0;
}

錯誤次數:4次

原因:思路完全錯誤(錯誤思路見上)。


文 / WIDA
2021.10.30成文
首發於WIDA個人部落格,僅供學習討論


更新日記:
2021.10.30 成文