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
";
19         else cout<<"NO
";
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
";
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<<"
";
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<<"
";
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
";
36     else{
37         cout<<"YES
"<<ans.size()<<"
";
38         for(auto i:ans){
39             cout<<i.first<<" "<<i.second<<"
";
40         }
41     }
42     return 0;
43 }

E:Nanosoft

F:Super Jaber

原文地址:https://www.cnblogs.com/charles1999/p/12309476.html