涵盖知识点:构造、数学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
F:Super Jaber
来源:https://www.cnblogs.com/charles1999/p/12309476.html