Codeforces Round #498 (Div. 3)【完结】
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #498 (Div. 3)【完结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2022.3.6
題單地址:https://codeforces.com/contest/1006
目錄
- A. Adjacent Replacements
- B. Polycarp's Practice【貪心】
- C. Three Parts of the Array【前綴和 / 哈希】
- D. Two Strings Swaps【分類討論】
- E. Military Problem【dfs】
- F. Xor-Paths【雙向搜索 / 折半搜索】
A. Adjacent Replacements
奇數全部變為比它大1的偶數,然后偶數全部再變成比自己小一的奇數,
可以看出。奇數變了兩次沒變,而偶數變成了比自己小1的奇數
B. Polycarp’s Practice【貪心】
#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5+10; LL n,k,x,sum; vector<pair<int,int>>ve; int main(void) {cin>>n>>k;ve.push_back({-1,-1});//哨兵,讓其從下標1開始for(int i=1;i<=n;i++) cin>>x,ve.push_back({x,i});sort(ve.begin()+1,ve.end());for(int i=n-k+1;i<=n;i++) sum+=ve[i].first;//取最大的k個值cout<<sum<<endl;vector<int>a;for(int i=n-k+1;i<=n;i++) a.push_back(ve[i].second);//將最大的k個值的下標存儲,排序。sort(a.begin(),a.end());int l=0;for(int i=0;i<a.size()-1;i++) cout<<a[i]-l<<" ",l=a[i];//以次分割cout<<n-l;return 0; }C. Three Parts of the Array【前綴和 / 哈希】
#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; typedef long long int LL; LL a[N],s[N],n; map<LL,int>mp; int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i],mp[s[i]]=i;LL sum=0,ans=0;for(int i=n;i>=1;i--){sum+=a[i];if(mp.count(sum)&&mp[sum]<i) ans=max(ans,sum);}cout<<ans;return 0; }D. Two Strings Swaps【分類討論】
題目的意思就是說我們需要預處理,使其可以根據上面的移動規則變成來相等的字符串。
預處理只可以該a字符串。
你會發現a[i] a[n-i+1] b[i] b[n-i+1]四個字符是可以互相移動的。故只需分類討論這四個字符即可。
詳細題解
E. Military Problem【dfs】
你會發現一個根和它的兒子都是挨著的。
F. Xor-Paths【雙向搜索 / 折半搜索】
如果直接暴力的搜索,那么時間復雜度為2^(n+m)一定會T的
但是我們可以雙向的搜索,即一個從開始的(1,1)搜索,一個從結束的(n,m)開始搜索。
每次都走一半的路程,那么總的時間復雜度為2^(n+m)/2 +2^(n+m)/2 最多不過1e6的時間復雜度是可以過的。
總結
以上是生活随笔為你收集整理的Codeforces Round #498 (Div. 3)【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #49
- 下一篇: Codeforces Beta Roun