Codeforces Round #750 (Div. 2)(A-D)题解

文章提供了四道来自Codeforces的编程问题的解决方案,包括处理音乐会歌曲时间分配以最小化时间差,计算数组子序列和差1的个数,将字符串转化为回文串的最少操作数,以及构造数组使得元素乘积和为0的方法。每道题目的解答都包含思路解析和AC代码示例。
摘要由CSDN通过智能技术生成

A. Luntik and Concerts

题目链接:Problem - A - Codeforces

题意:有两个音乐会,有a+b+c首歌曲,分别是一分钟,两分钟,三分钟,问如何分配歌曲使得两个音乐会举办的时间差最小。

思路:观察样例和举例可以发现答案只能是1或者0,我们可以计算总时间如果总时间为奇数那么答案就是1,是偶数就是0。

AC code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a,b,c;
void solve(){
    cin>>a>>b>>c;
    ll sum=a+b*2+c*3;
    if(sum&1){
        cout<<1<<endl;
    }else{
        cout<<0<<endl;
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

B. Luntik and Subsequences

题目链接:Problem - B - Codeforces

题意:给你一个数组,问你有多少个子序列满足子序列的总和等于原数组的总和-1。

思路:要使总和差1,那么一定只能去除1,此外,a[i]还有可能为0,假设1的个数为cnt1,0的个数为cnt0,那么答案就是cnt1^cnt0。

AC code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100;
int n,a[N],sum[N];
void solve(){
    cin>>n;
    int cnt1=0,cnt2=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]==0){
            cnt1++;
        }else if(a[i]==1){
            cnt2++;
        }
    }
    ll t1=1ll<<cnt1;
    ll ans=t1*cnt2;
    cout<<ans<<endl;
    
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

C. Grandma Capa Knits a Scarf

题目链接:Problem - C - Codeforces

题意:给出一个字符串,我们需要将字符串变换成回文字符串,我们每次可以选择一个特殊字母,然后对在字符串中的某一个或者几个特殊字母删除掉,求最少的操作次数,如果不可能变成回文字符串,那么输出-1。

思路:我们可以发现,如果能够使它变成回文字符串,那么只需删除一种特殊字母就行了,没有必要删除多种字母,因此,我们可以枚举26个英文字母将它们一一check,求最小的操作次数即可。

AC code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
string s;
ll f(char x){
    int l=1,r=n;
    ll cnt=0;
    while(l<r){
        if(s[l]==s[r]){
            l++;
            r--;
        }else if(s[l]==x){
            l++;
            cnt++;
        }else if(s[r]==x){
            r--;
            cnt++;
        }else{
            return 1e17;
        }
    }
    return cnt;
}
void solve(){
    cin>>n>>s;
    s='!'+s;
    ll ans=1e15;
    for(char i='a';i<='z';i++){
        ans=min(ans,f(i));
    }
    if(ans==1e15) cout<<-1<<endl;
    else cout<<ans<<endl;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

D. Vupsen, Pupsen and 0

题目链接:Problem - D - Codeforces

题意:给你一个数组a,均不等于0,要求你构造一个数组b使得所有的a[i]*b[i]的和为0。

思路:我们可以对一段区间满足和为0,那么所有的区间加起来和也为0,当n为偶数时,将两个看成一个区间,我们可以构造相反数使得和恰好为0,例如b[i]=-a[i+1],b[i+1]=a[i],对于n/2个区间都是这样即可,当n为奇数时,我们可以将三个看成一个区间,剩余的按照偶数的那样去做就行。如何构造三个区间和为0呢,我们可以在最后三个数里面找两个和不为0的数,假设a[i]和a[i+1],那么b[i]=-a[i+2],b[i+1]=-a[i+2],b[i+2]=(a[i]+a[i+1])就可以构造出来了,详情看代码。

AC code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n,a[N];
vector<ll> v;
void solve(){
    cin>>n;
    v.clear();
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    if(n&1){
        for(int i=1;i<=n-4;i+=2){
            v.push_back(-a[i+1]);
            v.push_back(a[i]);
        }
        int x=a[n-2],y=a[n-1],z=a[n];
        if(x+y){
            v.push_back(-z);
            v.push_back(-z);
            v.push_back(x+y);
        }else if(x+z){
            v.push_back(-y);
            v.push_back(x+z);
            v.push_back(-y);
        }else if(y+z){
            v.push_back(y+z);
            v.push_back(-x);
            v.push_back(-x);
        }
    }else{
        for(int i=1;i<=n-1;i+=2){
            v.push_back(-a[i+1]);
            v.push_back(a[i]);
        }
    }
    for(auto it : v){
        cout<<it<<' ';
    }
    cout<<endl;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值