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中取最优的 又−1≤ai≤109 0≤k≤109 将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; }