Codeforces Round #619 (Div. 2)ABC

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值