2021-10-28

A - Luntik and Concerts

题意:

一共a个 1, b个 2, c个 3分成两组,其中 a,b,c>=1 ,使得两组的元素和之差最小。求这个最小值。

题解:

c要么为奇数要么为偶数,同时a和b都大于1,如果c为奇数的话拿出一个1一个2就可以把所有的3都平均分了,如果是偶数的话所有的3能直接平均分。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        int num=a+b*2+c*3;
        if(num%2==0)
        cout<<0<<endl;
        else
        cout<<1<<endl;
    }
}

B - Luntik and Subsequences 

题意:

就是求比s少一的集合

题解:

首先找出所有的0和1,答案就是1的个数乘以2的零的个数的次方

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        long long ans=0,sum=0;
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            if(x==1)
            {
                ans++;
            }
            if(x==0)
            {
                sum++;
            }
        }
        long long cont=ans*pow(2,sum);
        cout<<cont<<endl;
    }
}

C - Grandma Capa Knits a Scarf

题意:

在字符串 s 中找一种字符 c,删去字符串中 ​​​x 个 ​​​c 得到字符串 ​​​s 1,且 s1 是回文串,求需要删去字符的个数 x 的最小值。

题解:

因为就删除一个,所以直接遍历26个字符来看看那个最小直接输出最小的那个就行了。

#include<bits/stdc++.h>
using namespace std;
int check(string s,char a)
{
    int l=0,r=s.size()-1;
    int conut=0;
    while(l<r)
    {
        if(s[l]==s[r])
        {
            l++;
            r--;
            continue;
        }
        if(s[l]!=s[r] && s[l]==a)
        {
            l++;
            conut++;
            continue;
        }
        if(s[r]!=s[l] && s[r]==a)
        {
            r--;
            conut++;
            continue;
        }
        return 1e7;
    }
    return conut;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       int n;
       cin>>n;
       string s;
       cin>>s;
       int ans=1e7;
       check(s,'a');
       for(char i='a';i<='z';i++)
       {
           ans=min(ans,check(s,i));
       }
       cout<<(ans==1e7?-1:ans)<<endl;

    }
}

D - Vupsen, Pupsen and 0 

题意:

已知某 n 项非零数列 a,找到某 n项非零数列 b,使得满足其中的两个条件就可以了a*b的和等于0

题解:

这道题要求构造一个b数组使得与对应a元素的乘积之和为0,并且要求b数组的各项绝对值之和要小于等于1e9,再结合a数组元素值的大小来看,已经暗示了只要将a数组进行相应的调整便可以。该题可以分为两种情况:

第一种:n为偶数的情况,此时两两相邻元素之间可以凑为一对,我们写为x y,那么很容易想到b数组对应的为-y x即可让这一对的sum变为0.
第二种:n为奇数的时候,这时候我们可以把前三个数单独拿出来计算,而从第四个数开始直到第n个数的做法就可以和第一种情况一样计算。
把前面三个数记为a b c,这时候我们可以将a+b看做一个整体记为A,所以此时的数为A c,b数组对应的值即为-c A,注意a+b不能为0,否则不符合题意。
 

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int nn;
        cin>>nn;
        for(int i=1;i<=nn;i++)cin>>a[i];
        if(nn%2==0)//第一种情况
        {
            for(int i=1;i<=nn;i++)
            {
                if(i%2!=0)cout<<-a[i+1]<<" ";
                else cout<<a[i-1]<<" ";
            }
            cout<<endl;
        }
        else
        {
            int m,n,l;
            if(a[1]+a[2]!=0){m=a[1],n=a[2],l=a[3];cout<<-l<<" "<<-l<<" "<<m+n<<" ";}
            else if(a[1]+a[3]!=0){m=a[1],n=a[3],l=a[2];cout<<-l<<" "<<m+n<<" "<<-l<<" ";}
            else if(a[2]+a[3]!=0){m=a[2],n=a[3],l=a[1];cout<<m+n<<" "<<-l<<" "<<-l<<" ";}
            for(int i=4;i<=nn;i++)
            {
                if(i%2==0)cout<<-a[i+1]<<" ";
                else cout<<a[i-1]<<" ";
            }
            cout<<endl;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值