Codeforces Round #619 (Div. 2) A

ai等于ci时 ci和bi交换 bi等于ci时 ci和ai交换

ci要么和ai交换 要么和bi交换 不能不换


 

#include<bits/stdc++.h>
#define ll  long long
using namespace std;
const int N=1e2+5;
char a[N],b[N],c[N];
int main(){
    int T;
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>T;
    while(T--){
        cin>>a>>b>>c;
        int n=strlen(a),flag=0;
        for(int i=0;i<n;i++)
        /* if(!(a[i]==b[i]||a[i]==c[i]||b[i]==c[i])){
             flag=1;
             break;
         }*/ //ci要么和ai交换 要么和bi交换 不能不换
          {
         //    if(a[i]==b[i]&&b[i]==c[i])continue;这种情况已经包括在下面的判断中了 
              if(a[i]==c[i]||b[i]==c[i])continue;
             flag=1;
             break;
         }
        if(flag)cout<<"NO"<<endl;
         else cout<<"YES"<<endl;
    }
    return 0;
}

 std

#include <bits/stdc++.h>
using namespace std;
#define oo 1000000000
#define mod 998244353
const int N = 500000;
string a , b , c;

void solve(){
    cin >> a >> b >> c;
    for(int i = 0 ;i < (int)a.size();i++){
        if(c[i] != a[i] && c[i] != b[i]){
            puts("NO");
            return;
        }
    }
    puts("YES");
    return;
}

int main(){
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}

被样例迷惑了好久,k取了和ai=-1相邻的非消失数去重后的平均数

后来了手造样例 5 6 7 100  显然最大值和最小值的平均数比所有数的平均数更优

当时应该缕清问题即最小化k到这些相邻的非消失数的距离的最大值   显然可以结合数轴 首先k一定在最小值和最大值之间

其次对于在k左边的数 k到他们的距离小于等于k到最小值的距离 对于在k右边的数 k到他们的距离小于等于k到最大值的距离

现在问题变为最小化max{|k-a|,|k-b|} 显然 $k=frac{a+b}{2}$  由于a≤k≤b,|k-a|+|k-b|=b-a为定值 其中一个小了 另一个就大了 所以尽可能使他们相等

因为b+a可能为奇数,又k为整数 $frac{a+b}{2}$小数部分为0.5 此时|k-a|和|k-b|必不可能相等 k舍弃小数部分或整数部分进1 都能使 |k-a|和|k-b|相差1

综上比赛时的代码特判全消失的情况 vector存下未消失的数 unique去重 k k±1中取最优的 又1ai109 0k10 将k与1e9和0比较使其在范围内都显得没有必要

赛时

#include<bits/stdc++.h>
#define int  long long
using namespace std;
//const int N=e+5;
const int N=1e5+5;
int a[N]; 
signed main(){
    int T;
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        int m=0;
        int flag=1;
        for(int i=1;i<=n;i++){
            if(a[i]!=-1){flag=0;break;        }
        }
        if(flag){
            cout<<0<<' '<<0<<endl;
            continue;
        }
        /*if(n==2){
            int num=0;
            for(int i=1;i<=n;i++)if(a[i]==-1)num++;
            if(num==1){
                cout<<0<<' '<<0<<endl;
                continue;        }
        }*/ 
        for(int i=2;i<=n;i++){
            if(a[i-1]!=-1&&a[i]!=-1)m=max(m,abs(a[i]-a[i-1]));
        }
        vector<int>b;
        int sum=0,tot=0;
        for(int i=1;i<=n;i++)
          if(a[i]==-1){
              if(i-1>=1&&a[i-1]!=-1)b.push_back(a[i-1]),tot++;
              if(i+1<=n&&a[i+1]!=-1)b.push_back(a[i+1]),tot++;
          }
        //for(int i=0;i<b.size();i++)cout<<b[i]<<endl;
        sort(b.begin(),b.end());
        tot=unique(b.begin(),b.end())-b.begin();
        //cout<<tot<<endl;
        /*for(int i=0;i<tot;i++)
         sum+=b[i];*/ 
        
         int k=min((b[0]+b[tot-1])/2,1ll*1000000000);
         int k1=min(k,1ll*1000000000);
         int k2=max(1ll*0,k-1);
         int k3=min(1ll*1000000000,k+1);
         int m1=m,m2=m,m3=m;
        for(int i=0;i<tot;i++)
         m1=max(m1,abs(b[i]-k1)),m2=max(m2,abs(b[i]-k2)),m3=max(m3,abs(b[i]-k3));
         if(m1<=m2&&m1<=m3) cout<<m1<<' '<<k1<<endl;
         else if(m2<=m1&&m2<=m3) cout<<m2<<' '<<k2<<endl;
          else if(m3<=m2&&m3<=m2) cout<<m3<<' '<<k3<<endl;
    }
    return 0;
}

 赛后

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int main(){
    int T;
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>T;
    while(T--){
        int n,ma=0,mi=1e9,ans=0;//ma=-1e9;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<n;i++){//i i+1两项中有一个消失的数 故i<n
        if(a[i]==-1&&a[i+1]!=-1)ma=max(ma,a[i+1]),mi=min(mi,a[i+1]);
        if(a[i]!=-1&&a[i+1]==-1)ma=max(ma,a[i]),mi=min(mi,a[i]);
        //if(a[i]!=-1&&a[i+1]!=-1)ans=max(ans,abs(a[i]-a[i+1]);
} // cout<<mi<<' '<<ma<<endl; int k=(ma+mi)/2; for(int i=1;i<=n;i++)//得先把消失的数变为k i-1 i两项比较得i>1 { if(a[i]==-1)a[i]=k; if(i>1)ans=max(ans,abs(a[i]-a[i-1])); } cout<<ans<<' '<<k<<endl; } return 0; }

std1

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
#define int long long 
const int maxn = 200005,mod=1000000007;
int ans[maxn],a[maxn];
signed main(){

    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            ans[i]=0;
        }
        int cnt=0,res=0;
        for(int i=1;i<n;i++){
            if(a[i]==-1&&a[i+1]!=-1) ans[++cnt]=a[i+1];
            else if(a[i]!=-1&&a[i+1]==-1) ans[++cnt]=a[i];
            else if(a[i]!=-1&&a[i+1]!=-1) res=max(res,abs(a[i+1]-a[i]));
        }
        sort(ans+1,ans+1+cnt);
        int res2,res3;
        if(cnt==0) res2=0;
        else res2=(ans[cnt]-ans[1])/2;
        if((ans[cnt]-ans[1])%2==1) res2++;//a+b为奇数时,|k-a|和|k-b|不相等 较小的为res2 较大的为res2+1 又得取max 故res++

        cout<<max(res,res2)<<" "<<res2+ans[1]<<endl;//(a+b)/2=a+(b-a)/2 这样还能避免a+b溢出int
    }

    return 0;
}

std2

#include <bits/stdc++.h>
using namespace std;
#define oo 1000000010
#define mod 1000000007
const int N = 300010;
int n , arr[N] ; 

void solve(){
    int mn = oo , mx = -oo;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    for(int i = 0;i<n;i++){
        if(i > 0 && arr[i] == -1 && arr[i - 1] != -1)
            mn = min(mn , arr[i - 1]) , mx = max(mx , arr[i - 1]);
        if(i < n - 1 && arr[i] == - 1 && arr[i + 1] != -1)
            mn = min(mn , arr[i + 1]) , mx = max(mx , arr[i + 1]);
    }
    int res = (mx + mn) / 2;
    int ans = 0;
    for(int i=0;i<n;i++){
        if(arr[i] == -1)
            arr[i] = res;
        if(i)
            ans = max(ans,abs(arr[i] - arr[i - 1]));
    }
    printf("%d %d
",ans,res);
}


int main(){
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wyh447154317/p/12307136.html