A. Three Strings
只需满足c的每一位等于a对应的那位或等于b对应的那位即符合条件
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
string a,b,c;
cin>>a>>b>>c;
bool flag=true;
for(int i=0;i<c.length();i++){
if(c[i]!=a[i]&&c[i]!=b[i]){
flag=false;
break;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B. Motarack’s Birthday!
找出与-1相邻的非-1数的最大值和最小值,k即为他们的平均数
注意数据范围要开long long
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
ll a[100005];
ll b[100005];
int main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
int num=0;//统计非-1出现个数
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]!=-1)num++;
}
if(num==0){//若全为-1输出0,0
cout<<0<<' '<<0<<endl;
continue;
}
ll maxs=-1;
ll mins=INF;
for(int i=1;i<=n;i++){
if(a[i]==-1){
if(i-1>=1&&a[i-1]!=-1){
mins=min(mins,a[i-1]);
maxs=max(maxs,a[i-1]);
}
if(i+1<=n&&a[i+1]!=-1){
mins=min(mins,a[i+1]);
maxs=max(maxs,a[i+1]);
}
}
}
ll k=(maxs+mins)/2;
if(a[1]==-1)a[1]=k;
ll maxss=-1;
for(int i=2;i<=n;i++){
if(a[i]==-1)a[i]=k;
maxss=max(maxss,abs(a[i]-a[i-1]));
}
cout<<maxss<<' '<<k<<endl;
}
return 0;
}
C. Ayoub’s function
因为直接求1不好算,所以我们反过来想
求含1的区间个数,就是求(所有区间个数-全含0的区间个数)
设整个区间长度为n,则所有区间个数为n(n+1)/2
设全含0的区间长度为n,则区间内的个数为n(n+1)/2
使含1的区间个数尽可能多,即 使全含0的区间个数尽可能少
我们可以想象1为板子切割一整串0,要把0切割的尽可能平均,全含0的区间个数才能最少
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
int main(){
int t;cin>>t;
while(t--){
ll n,m;cin>>n>>m;
if(m==0){//如果全是0,则不存在
cout<<0<<endl;
continue;
}
ll all=(n+1)*n/2;//总区间个数
ll k=(n-m)/(m+1);//被切割的最短的0的区间长度
ll shengyu=(n-m)%(m+1);//有这么多个区间长度为k+1
for(ll i=1;i<=shengyu;i++){//处理长度为k+1
all=all-(k+2)*(k+1)/2;
}
for(ll i=1;i<=(m+1-shengyu);i++){//处理长度为k
all=all-(k+1)*k/2;
}
cout<<all<<endl;
}
return 0;
}