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\n";
        else cout<<"NO\n";
    }
}

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\n", i.first, i.second);
    }
    return 0;
 }

 

posted @ 2020-02-14 17:26  overrate_wsj  阅读(271)  评论(0编辑  收藏  举报