Codeforces Round #658 (Div. 2)
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堆石子(留一個讓對方拿就贏了)。
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)大佬博客
正確代碼
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拼湊方法。
要加油哦~
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #658 (Div. 2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前开发部负责人:微软放弃 Windows
- 下一篇: M-SOLUTIONS Programm