Codeforces Round #619 (Div. 2)【A、B、C、D】题解(持续更新)
涵盖知识点:构造、数学etc.
比赛链接:
https://codeforces.com/contest/1301
A:Three Strings
题意:给三个串,每一位必须交换a和c或者b和c。问是否可能交换完成后a=b。
题解:判断每一位是否又a[i]=c[i]或者b[i]=c[i]。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int t; 6 cin>>t; 7 while(t--){ 8 string a,b,c; 9 cin>>a>>b>>c; 10 bool flag=true; 11 for(int i=0;i<a.length();i++){ 12 if(a[i]==c[i]||b[i]==c[i]){ 13 continue; 14 } 15 flag=false; 16 break; 17 } 18 if(flag)cout<<"YES\n"; 19 else cout<<"NO\n"; 20 } 21 return 0; 22 }
B:Motarack's Birthday
题意:给一串数字,用k填充所有的-1,使所有相邻两数的差绝对值最小。
题解:记录所有-1两边的非-1数字,最后将所有数字排序后取最小值和最大值的平均值。以及已存在相邻数字的差绝对值的最小值。输出较大者。k取平均值。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 int num[maxn]; 5 vector<int> v; 6 int main(){ 7 int t; 8 cin>>t; 9 while(t--){ 10 v.clear(); 11 int n; 12 cin>>n; 13 int res=0; 14 for(int i=0;i<n;i++){ 15 scanf("%d",&num[i]); 16 } 17 for(int i=0;i<n;i++){ 18 if(num[i]==-1){ 19 if(i-1>=0&&num[i-1]!=-1) 20 v.push_back(num[i-1]); 21 if(i+1<n&&num[i+1]!=-1) 22 v.push_back(num[i+1]); 23 } 24 else{ 25 if(i-1>=0&&num[i-1]!=-1) 26 res=max(res,abs(num[i]-num[i-1])); 27 if(i+1<n&&num[i+1]!=-1) 28 res=max(res,abs(num[i+1]-num[i])); 29 } 30 } 31 if(v.size()==0){ 32 cout<<"0 0\n"; 33 continue; 34 } 35 sort(v.begin(),v.end()); 36 int k=(v[0]+v[v.size()-1])/2; 37 res=max(res,max(k-v[0],v[v.size()-1]-k)); 38 cout<<res<<" "<<k<<"\n"; 39 } 40 return 0; 41 }
C:Ayoub's function
题意:问长度为n的含有m个1的0-1字符串,最大存在多少个不同字串使得字串中至少含有1个1.
题解:逆向思维,即最少算出有多少的字串全是0即可。m个1可以将剩余的0分成m+1块。尽量均分可以是答案最小。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int main(){ 5 int t; 6 cin>>t; 7 while(t--){ 8 ll n,m; 9 cin>>n>>m; 10 ll x=n-m; 11 m++; 12 ll a=x/m,b=x%m; 13 ll ans=n*(n+1)/2-(a+1)*a/2*(m-b)-(a+2)*(a+1)/2*b; 14 cout<<ans<<"\n"; 15 } 16 return 0; 17 }
D:Time to Run
题意:n行m列矩阵,相邻格点之间有双向道路,不能重复走,问能否走k次。
题解:一定存在一种解能走完所有的双向路。如下图。取前k步走即可,若k大于最大可能的步数则不存在解。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef pair<int,string> pis; 5 vector<pis> v,ans; 6 int main(){ 7 int n,m,k; 8 cin>>n>>m>>k; 9 for(int i=0;i<n-1;i++){ 10 if(m!=1){ 11 v.emplace_back(m-1,"R"); 12 v.emplace_back(m-1,"L"); 13 } 14 v.emplace_back(1,"D"); 15 } 16 if(m!=1)v.emplace_back(m-1,"R"); 17 for(int i=0;i<m-1;i++){ 18 if(n!=1){ 19 v.emplace_back(n-1,"U"); 20 v.emplace_back(n-1,"D"); 21 } 22 v.emplace_back(1,"L"); 23 } 24 if(n!=1)v.emplace_back(n-1,"U"); 25 for(auto i:v){ 26 if(k>=i.first){ 27 k-=i.first; 28 ans.push_back(i); 29 }else if(k!=0&&i.first>k){ 30 ans.emplace_back(k,i.second); 31 k=0; 32 break; 33 } 34 } 35 if(k)cout<<"NO\n"; 36 else{ 37 cout<<"YES\n"<<ans.size()<<"\n"; 38 for(auto i:ans){ 39 cout<<i.first<<" "<<i.second<<"\n"; 40 } 41 } 42 return 0; 43 }
E:Nanosoft