• 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

  • 相关阅读:
    【Python必学】Python爬虫反爬策略你肯定不会吧?
    SpringBoot_日志-切换日志框架
    dev、test和prod是什么意思
    SpringBoot_日志-指定日志文件和日志Profile功能
    SpringBoot_日志-SpringBoot默认配置
    SpringBoot_日志-SpringBoot日志关系
    SpringBoot_日志-其他日志框架统一转换为slf4j
    SpringBoot_日志-日志框架分类和选择
    SpringBoot_配置-@Conditional&自动配置报告
    gcc系列工具 介绍
  • 原文地址:https://www.cnblogs.com/charles1999/p/12309476.html
Copyright © 2020-2023  润新知