【竞赛题解】Codeforces Round #710 (Div. 3)
B. Partial Replacement
題意:有字符串由.和*組成,可標(biāo)記其中*,首尾的*必須被標(biāo)記,使被標(biāo)記的*之間距離不超過k,求最少的標(biāo)記量
思路:首先從首尾出發(fā)確定首尾*的位置,再由首beg出發(fā)向后的k個(gè)元素里,將最靠右的*標(biāo)記
選擇最右的標(biāo)記為了更快地抵達(dá)尾ed,該局部最優(yōu)可推廣到全局最優(yōu)
將剛標(biāo)記的*作為新的起點(diǎn),再在向后k個(gè)元素里標(biāo)記最右的*,重復(fù)執(zhí)行上述步驟直至抵達(dá)尾ed為止
#include <bits/stdc++.h> #define fastio() ios_base::sync_with_stdio(0);cin.tie(0) using namespace std; int main() {fastio();int t;cin >> t;while (t--){int n, k;cin >> n >> k;string s;cin >> s;int beg = 0, ed = n - 1;while (s[beg] != '*') ++beg;while (s[ed] != '*') --ed;int ans = 2;if (beg == ed) ans--;for (int i = beg;;){int j = i + k;if (j >= ed) break;while (s[j] != '*') --j;ans++;i = j;}cout << ans << "\n";}return 0; }D. Epic Transformation
題意:對于整型數(shù)組內(nèi),每一對不相等的元素可以進(jìn)行消除,試求可將數(shù)組消除到剩余盡可能少元素的數(shù)量
思路:首先將數(shù)組排序,將相同的元素聚集在一起,再將數(shù)組從正中間分為左右兩部分,假如「沒有相同的值跨越中線」(例如:1122 | 3344),即左邊的任意值在右邊找不到與其相等的值,則每次消除分別從左右兩邊各選任意一個(gè)元素即可,最后達(dá)到兩邊全部消除;若有相同值跨越中線
記跨越中線的值為R,首先將左邊的R與右邊的非R匹配消除、將右邊的R與左邊的非R匹配消除,若此時(shí)R被消除完,則說明剩余的狀態(tài)可歸類為「沒有相同的值跨越中線」,即最終可以全部消除完,而若仍有R剩余(此時(shí)其他均已被消除),其實(shí)只剩下未被消除的R(此時(shí)無法繼續(xù)消除),因此剩余R的數(shù)量即為所求答案。當(dāng)然,當(dāng)數(shù)組元素?cái)?shù)量為奇數(shù)時(shí),正中間的數(shù)最后一定會剩余,加以討論即可。
#include <bits/stdc++.h> #define fastio() ios_base::sync_with_stdio(0);cin.tie(0) using namespace std; int main() {fastio();int t;cin >> t;while (t--){int n;cin >> n;vector<int> v(n);for (int i = 0; i < n; i++) cin >> v[i];sort(v.begin(), v.end());int ans = n & 1 ? 1 : 0;int mid_pos = n / 2;int mid_elem = v[mid_pos];int left_me_cnt = 0, right_me_cnt = 0, half_cnt = n / 2;int left_pos, right_pos;if (n & 1){left_pos = mid_pos - 1;right_pos = mid_pos + 1;}else{left_pos = mid_pos - 1;right_pos = mid_pos;}while (left_pos >= 0 && v[left_pos] == mid_elem) left_me_cnt++, left_pos--;while (right_pos < n && v[right_pos] == mid_elem) right_me_cnt++, right_pos++;ans += 2 * max(0, right_me_cnt - (half_cnt - left_me_cnt));cout << ans << "\n";}return 0; }E. Restoring the Permutation
題意:原始數(shù)組A為長度為n,由1-n元素組成,現(xiàn)給出它的「當(dāng)前最大值數(shù)組」B,即有 bi=max(a1,a2,...,ai)b_i = max(a_1,a_2,...,a_i)bi?=max(a1?,a2?,...,ai?),例如:A{3,1,4,2,7,5,6} 則有B{3,3,4,4,7,7,7},現(xiàn)在由給出的「當(dāng)前最大值數(shù)組」求可能的「最小序原始數(shù)組」和「最大序原始數(shù)組」,大小序可將上面數(shù)組A{3,1,4,2,7,5,6} 理解成整型 3142756 再比大小,即越靠前的元素權(quán)值越重
思路:
- 「最小序原始數(shù)組」
其實(shí)可以理解為當(dāng)cur_max數(shù)組剛發(fā)生變化時(shí),該位置對應(yīng)的結(jié)果便為當(dāng)前的最大值,而后若cur_max未發(fā)生變化則由小到大將序列元素依次填入即可(思路即是:使越靠前的位置放置越小的元素),由于是由小到大選元素,這樣的選取總能使結(jié)果數(shù)組滿足對應(yīng)的「當(dāng)前最大值數(shù)組」
- 「最大序原始數(shù)組」
總體思路與前者相反,即使越靠前的位置放置盡可能大的元素,當(dāng)我們考慮第二個(gè)元素的選擇的時(shí)候:當(dāng)然可選的最大元素為 7 ,但此時(shí)cur_max[2] = 3,說明我們只能考慮從不大于3的元素選取,而3被第一個(gè)元素選了,因此盡可能大的選擇是2。于是更詳細(xì)的思路是:「每次選擇不大于cur_max[i]的盡可能大的數(shù)」
這里通過棧結(jié)構(gòu)來完成此過程:
總結(jié)
以上是生活随笔為你收集整理的【竞赛题解】Codeforces Round #710 (Div. 3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图论】(二分图)J. Burnishe
- 下一篇: 【竞赛题解】第22次CCF计算机软件能力