日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【竞赛题解】Codeforces Round #710 (Div. 3)

發(fā)布時(shí)間:2023/12/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【竞赛题解】Codeforces Round #710 (Div. 3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)來完成此過程:

  • 首先讀到cur_max[0] = 3,將[1,3][1,3][1,3]依次入棧,再對于此后cur_max[i] == 3依次取棧頂元素并出棧(這樣保證了「每次選擇不大于cur_max[i]的盡可能大的數(shù)」),到了cur_max[3] = 4,此時(shí)棧中還剩余元素 1
  • cur_max[3] = 4,將[3+1,4][3 +1,4][3+1,4] (其實(shí)只有4本身)依次入棧,和上述同樣的操作,讀到cur_max[5] = 7,此時(shí)棧為空
  • cur_max[5] = 7,將[4+1,7][4+1,7][4+1,7]依次入棧,最后再依次出棧作為結(jié)果
  • #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> q(n);for (int i = 0; i < n; i++) cin >> q[i];;vector<int> used(n + 1);vector<int> min_ans(n);int pos = 1;min_ans[0] = q[0], used[q[0]] = 1;for (int i = 1; i < n; i++){if (q[i] == q[i - 1]){while (used[pos]) ++pos;min_ans[i] = pos;used[pos] = 1;}else{min_ans[i] = q[i];used[q[i]] = 1;}}for (int i = 0; i < n - 1; i++) cout << min_ans[i] << " ";cout << min_ans[n - 1] << "\n";vector<int> max_ans(n);stack<int> st;int pre_val = 0;for (int i = pre_val + 1; i <= q[0]; i++) st.push(i);max_ans[0] = st.top(); st.pop();for (int i = 1; i < n; i++){if (q[i] == q[i - 1]){max_ans[i] = st.top(); st.pop();}else{pre_val = q[i - 1];for (int j = pre_val + 1; j <= q[i]; j++) st.push(j);max_ans[i] = st.top(); st.pop();}} for (int i = 0; i < n - 1; i++) cout << max_ans[i] << " ";cout << max_ans[n - 1] << "\n";}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的【竞赛题解】Codeforces Round #710 (Div. 3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。