【竞赛题解】Codeforces Round #710 (Div. 3)
B. Partial Replacement
題意:有字符串由.和*組成,可標記其中*,首尾的*必須被標記,使被標記的*之間距離不超過k,求最少的標記量
思路:首先從首尾出發確定首尾*的位置,再由首beg出發向后的k個元素里,將最靠右的*標記
選擇最右的標記為了更快地抵達尾ed,該局部最優可推廣到全局最優
將剛標記的*作為新的起點,再在向后k個元素里標記最右的*,重復執行上述步驟直至抵達尾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
題意:對于整型數組內,每一對不相等的元素可以進行消除,試求可將數組消除到剩余盡可能少元素的數量
思路:首先將數組排序,將相同的元素聚集在一起,再將數組從正中間分為左右兩部分,假如「沒有相同的值跨越中線」(例如:1122 | 3344),即左邊的任意值在右邊找不到與其相等的值,則每次消除分別從左右兩邊各選任意一個元素即可,最后達到兩邊全部消除;若有相同值跨越中線
記跨越中線的值為R,首先將左邊的R與右邊的非R匹配消除、將右邊的R與左邊的非R匹配消除,若此時R被消除完,則說明剩余的狀態可歸類為「沒有相同的值跨越中線」,即最終可以全部消除完,而若仍有R剩余(此時其他均已被消除),其實只剩下未被消除的R(此時無法繼續消除),因此剩余R的數量即為所求答案。當然,當數組元素數量為奇數時,正中間的數最后一定會剩余,加以討論即可。
#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
題意:原始數組A為長度為n,由1-n元素組成,現給出它的「當前最大值數組」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},現在由給出的「當前最大值數組」求可能的「最小序原始數組」和「最大序原始數組」,大小序可將上面數組A{3,1,4,2,7,5,6} 理解成整型 3142756 再比大小,即越靠前的元素權值越重
思路:
- 「最小序原始數組」
其實可以理解為當cur_max數組剛發生變化時,該位置對應的結果便為當前的最大值,而后若cur_max未發生變化則由小到大將序列元素依次填入即可(思路即是:使越靠前的位置放置越小的元素),由于是由小到大選元素,這樣的選取總能使結果數組滿足對應的「當前最大值數組」
- 「最大序原始數組」
總體思路與前者相反,即使越靠前的位置放置盡可能大的元素,當我們考慮第二個元素的選擇的時候:當然可選的最大元素為 7 ,但此時cur_max[2] = 3,說明我們只能考慮從不大于3的元素選取,而3被第一個元素選了,因此盡可能大的選擇是2。于是更詳細的思路是:「每次選擇不大于cur_max[i]的盡可能大的數」
這里通過棧結構來完成此過程:
總結
以上是生活随笔為你收集整理的【竞赛题解】Codeforces Round #710 (Div. 3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图论】(二分图)J. Burnishe
- 下一篇: 【竞赛题解】第22次CCF计算机软件能力