• Codeforces Round #619 (Div. 2) 题解


    A. Three Strings

    #include<iostream>
    #include<algorithm> 
    using namespace std;
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            string a,b,c;
            cin>>a>>b>>c;
            int flag=1;
            for(int i=0;i<a.length();i++){
                if(a[i]==b[i] && b[i]==c[i]) continue;
                else if(a[i]==c[i]) continue;
                else if(b[i]==c[i]) continue;
                else {
                    flag=0;break;
                }
            }
            if(flag==1) cout<<"YES
    ";
            else cout<<"NO
    ";
        }
    }

    B. Motarack's Birthday

    思路:找到在-1附近(不包括-1)数值的最大最小值,然后K=(max+min)/2,最后将k代回数组统计一下相邻的最大值即可

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define inf 0x3f3f3f3f
     using namespace std;
     typedef long long ll;
     const int maxn=2e5+10;
     ll a[maxn];
     int main()
     {
         int x,n;
         cin>>x;
         while(x--){
             scanf("%d",&n);
             for(int i=0;i<=2*n;i++) a[i]=0;
             for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
            ll mx=-inf,mi=inf;
            for(int i=1;i<=n;i++){
                if(a[i]==-1) continue;
                if(a[i-1]==-1||a[i+1]==-1){
                    mx=max(a[i],mx);
                    mi=min(a[i],mi);
                }
            }
            if(mx==-inf&&mi==inf){
                cout<<"0 1"<<endl;
                continue;
            }    
            ll k=(mx+mi)/2;
            mx=-inf;
            for(int i=2;i<=n;i++){
                ll x=a[i],y=a[i-1];
                if(x==-1) x=k;
                if(y==-1) y=k;
                mx=max(abs(x-y),mx);
            }
            cout<<mx<<" "<<k<<endl;
         }
        return 0;
     }

    C. Ayoub's function

    思路:直接推出公式 (n*(n+1))/2 - [k*(k+1)/2]*g - (k+1)*(z mod g)  ,其中z = (n-m) , g=m+1, k = z/g (向下取整)

    #include<iostream>
    #include<algorithm>
     using namespace std;
     typedef long long ll;
     int main()
     {
         ll n,m,x,y,c,t;
         int k;
         cin>>k;
         while(k--){
             scanf("%lld%lld",&n,&m);
             t=n;
             n-=m;
             m++;
             x=n/m;
             y=n%m;
             c=m-y;
             cout<<t*(t+1)/2-x*(x+1)*c/2-(x+1)*(x+2)*y/2<<endl;
        }
         return 0;
     }

    D. Time to Run

    思路:可以发现通过合适的方法,我们可以将所有边都走遍,那么这个方法就是先不停向右再不停向左然后向下直到走到最后一行的最右边,然后开始向上走再向下走再向左走就可以将整张图走完

    比较复杂的就是如何记录路径,可以开一个vector里面存放的是pair<int x,char ch>,分别是重复的次数与方向

    之后再不停答案存到另一个vector中,然后累计x直到k位置就跳出,最后再输出即可

    #include<iostream>
    #include<algorithm>
    #include<vector>
     using namespace std;
     vector<pair<int,char> > a,ans;
     int n,m,k;
     void inse(int x,char ch)
     {
         if(x>0) a.push_back({x,ch});
     }
     inline void insertt(int x, char c) {
        if (x > 0) { ans.push_back({x, c}); }
     }
     bool solve() {
        for (auto i : a) {
            insertt(std::min(i.first, k), i.second);
            k -= std::min(i.first, k);
        }
        return k <= 0;
     }
     int main()
     {
         scanf("%d%d%d",&n,&m,&k);
         for(int i=1;i<n;i++){
             inse(m-1,'R');
             inse(m-1,'L');
             inse(1,'D');
         }
         inse(m-1,'R');
        for(int i=1;i<m;i++){
            inse(n-1,'U');
            inse(n-1,'D');
            inse(1,'L');
        }
        inse(n-1,'U');
        if(!solve()) cout<<"NO"<<endl;
        else{
            cout<<"YES"<<endl;
            cout<<ans.size()<<endl;
            for (auto i : ans) printf("%d %c
    ", i.first, i.second);
        }
        return 0;
     }
  • 相关阅读:
    TCP和UDP区别
    session和cookie的区别
    2019 腾讯正式批笔试题题解
    modCount干嘛的
    分布式系统唯一ID生成方案汇总
    分布式数据库名词
    快手第一题
    南柯一梦
    349. 两个数组的交集
    synchronized锁优化
  • 原文地址:https://www.cnblogs.com/overrate-wsj/p/12308192.html
Copyright © 2020-2023  润新知