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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #658 (Div. 2)

發(fā)布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #658 (Div. 2) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

A - Common Subsequence

最短相同子序列長度肯定為1,如果一個元素都不相等之間不存在相同子序列

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=1010; int n,m; int a[N],b[N]; bool st[N]; int main() {IO;int T;cin>>T;while(T--){memset(st,0,sizeof st);cin>>n>>m;for(int i=0;i<n;i++){cin>>a[i];st[a[i]]=1;}bool flag=0;for(int i=0;i<m;i++) cin>>b[i];for(int i=0;i<m;i++)if(st[b[i]]) {flag=1;cout<<"YES"<<endl;cout<<1<<" "<<b[i]<<endl;break;}if(!flag) cout<<"NO"<<endl;}return 0; }

B - Sequential Nim

看到這題以為是普通的Nim游戲,發(fā)現(xiàn)寫出來不對(最后發(fā)現(xiàn)看錯題了-.-
想贏必須拿到最后一堆(n)石子,要拿到最后一堆,如果n-1堆石子個數(shù)為1,那么必須拿到n-2堆石子,如果n-1堆石子個數(shù)大于1,只需要拿到n-1堆石子(留一個讓對方拿就贏了)。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=100010; int a[N],n; int main() {IO;int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int j;for(j=n;j>1;){if(a[j-1]>1) j--;else j-=2;}if(j==0) cout<<"Second"<<endl;else cout<<"First"<<endl;}return 0; }

C1 - Prefix Flip (Easy Version)

每次把a最后那個用第一個使之與b對應(yīng),模擬。時間復(fù)雜度O(n2)O(n^2)O(n2)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> using namespace std; int n; void calc(string &a,int pos) {for(int i=0;i<pos;i++){if(a[i]=='1') a[i]='0';else a[i]='1';}reverse(a.begin(),a.begin()+pos); } int main() {IO;int T;cin>>T;while(T--){cin>>n;;vector<int> res;string a,b;cin>>a>>b;for(int i=n-1;i;i--){if(a[i]==b[i]) continue;if(a[0]==b[i]) {res.push_back(1);if(a[0]=='1') a[0]='0';else a[0]='1';}res.push_back(i+1);calc(a,i+1);}if(a[0]!=b[0]) res.push_back(1);cout<<res.size()<<" ";for(auto t:res) cout<<t<<" ";cout<<endl;}return 0; }

C2 - Prefix Flip (Hard Version)

以為只需要把變換那一步打個標(biāo)記就能過,可惜reverse的時間復(fù)雜度好像是O(n)O(n)O(n)下面代碼還是T了

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){cin>>n;int cnt=0;vector<int> res;string a,b;cin>>a>>b;for(int i=n-1;i;i--){if(cnt%2==0&&a[i]==b[i]||cnt%2==1&&a[i]!=b[i]) continue;if(cnt%2==0&&a[0]==b[i]||cnt%2==1&&a[0]!=b[i]) res.push_back(1);res.push_back(i+1);reverse(a.begin(),a.begin()+i+1);//這一步非常占時間cnt++;}if(cnt%2==0&&a[0]!=b[0]||cnt%2==1&&a[0]==b[0]) res.push_back(1);cout<<res.size()<<" ";for(auto t:res) cout<<t<<" ";cout<<endl;}return 0; }

后來想了想發(fā)現(xiàn)reverse這一步并不容易用打標(biāo)記的方法,看了題解之后發(fā)現(xiàn)這種方法貌似不能在一個較優(yōu)的時間復(fù)雜度解決此問題。
正解①先把a所有字符變成相同的字符(全是0或者全是1)②從后向前掃描b簡單操作即可。時間復(fù)雜度O(n)O(n)O(n)大佬博客
正確代碼

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){cin>>n;int cnt=0;vector<int> res;string a,b;cin>>a>>b;for(int i=1;i<n;i++)if(a[i]!=a[i-1]) res.push_back(i);char now=a[n-1];//最終a中所有字符應(yīng)該是nowfor(int i=n-1;i>=0;i--)if(now!=b[i]) {res.push_back(i+1);now=(now=='0'?'1':'0');}cout<<res.size()<<" ";for(auto t:res) cout<<t<<" ";cout<<endl;}return 0; }

D. Unmerge

對于這種題要求a滿足b也滿足只需要考慮一種情況,我們不妨考慮最終a串是否滿足題意。
4 3 2 5 1 11 9 12 8 6 10 7對于樣例可以發(fā)現(xiàn)4 3 2、5 1、11 9、12 8 6 10 7這些子串被綁定在一起,要么全部屬于a,要么全部屬于b,也就是對于a可以選擇這些也可以不選擇這些,明顯這是個01背包問題。把這些子串看出一個整體作為一個物品,物品價值和題解等于子串長度,那么原問題可以轉(zhuǎn)化為對于體積容量為n的背包是否能夠存在價值為n拼湊方法。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> using namespace std; int n; const int N=4010; int v[N],idx,f[N]; int last; void init() {for(int i=0;i<=2*n;i++) f[i]=v[i]=0;last=idx=0; } int main() {IO;int T;cin>>T;while(T--){init();cin>>n;for(int i=0;i<2*n;i++){int x;cin>>x;if(x>last){idx++;last=x;}v[idx]++;}for(int i=1;i<=idx;i++)for(int j=n;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+v[i]);if(f[n]==n) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0; }

要加油哦~

總結(jié)

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

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