其他分享
首页 > 其他分享> > 10.27 训练

10.27 训练

作者:互联网

A - Luntik and Concerts

题意:

一个人要举办两场音乐会,他现在有a个一分钟歌曲,b个两分钟歌曲,c个三分钟歌曲(a,b,c>=1)

现在需要你规划这两场,使这两场音乐会的演唱差值最小,并输出这个最小差值。

思路:

先求演唱时间和,若是偶数则划分两场时间相等,奇数则有一场多一分钟。

代码:

#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        long long a,b,c,sum=0;
        cin>>a>>b>>c;
        sum=a+b*2+c*3;
        if(sum%2==0)
        cout<<0<<endl;
        else
        cout<<1<<endl;
    }
}

B - Luntik and Subsequences

题意:

给一个整数n,之后n个数,你可以当作删去任意个数个元素后得到子数组,问子数组里和等于原数组和-1的子数组个数有多少。

思路:

统计1的个数和0的个数,有一个零就有2种方案,所以不是简单的将2相加,而是求2的幂

即选择一个 1 和任意个 0 舍去,设 1 有 cnt1 个, 0 有 cnt2 个,则答案是 cnt1*pow(2,cnt0)

代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int a[100]={0};
        long long n,cnt0=0,cnt1=0;
        long long ans=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
             cin>>a[i];
             if(a[i]==0)
             cnt0+=1;
             if(a[i]==1)
             cnt1+=1;
        }
        ans=cnt1*pow(2,cnt0);
        cout<<ans<<endl;
    }
}

C - Grandma Capa Knits a Scarf

题意:

给你一个字符串让你经过一些操作后,判断是否是回文串,你只能删除一种相同的字符,如果删除后是回文串,输出删除字符串的个数,若不是,输出-1。

思路:

由于我们只能选择一种字符,所以我们枚举所有的26个小写字母,然后用双指针,一个指开头,一个指结尾,两个字符相等就双指针都移动,如果不相等,看当前指向的字符是不是可以删掉,即等于当前所遍历的字符ch,如果相等则说明可以删掉当前字母,删掉字母的数量cnt++,否则说明当前遍历的字母不能构成回文,因为前后两个对称的字母又不相等,又没法删掉一个字母,所以接着遍历下一个字母,每次取最小值即可。

代码:

#include <iostream>
using namespace std;
int a[100005];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        string s;
        cin>>n>>s;
        int res=1e9;
        for (int ch=0; ch<26; ch++)
        {
            int l=0,r=n-1,cnt=0;
            while(l<=r)
            {
                if(s[l]==s[r])
                    l++,r--;
                else if(s[l] == char(ch + 'a'))
                    l++,cnt++;
                else if(s[r] == char(ch + 'a'))
                    r--,cnt++;
                else
                {
                    cnt=1e9;
                    break;
                }
            }
            res=min(res,cnt);
        }
        if(res==1e9)
            res=-1;
        cout<<res<<endl;
    }
    return 0;
}

D - Vupsen, Pupsen and 0

题意:

给你n个数为a数组,让你求一个b数组使得a,b数组对应位置相乘后的和为0

思路:

最开始想的暴力,毫无意外直接t掉,换种思路,比如1,2,3,4。我们使其两两一组,然后发现1*2+2(-1)=0,3*4+4*(-3)=0。没有错,规律题,分成数组内元素个数奇偶来判断,偶数的话如上述例子不断输出a[i] 和 - a[i+1] 即可。奇数的话,因为会多一个,所以我们处理掉前三个使其和为0,那么剩下的按照偶数的处理即可,后面的按照偶数的处理和为0,所以前三个处理完也是0(题目表明,必定有解),那么三个数,将两个数求和为一个数,在于另一个数按照偶数个元素方式解决即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,t;
int a[N],b[N];

int main(){
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        if(n%2==1)
        {
            if(a[0]+a[1])
				cout<<-a[2]<<" "<<-a[2]<<" "<<a[0]+a[1]<<" ";
			else if(a[1]+a[2])
				cout<<a[1]+a[2]<<" "<<-a[0]<<" "<<-a[0]<<" ";
			else
				cout<<-a[1]<<" "<<a[0]+a[2]<<" "<<-a[1]<<" ";
            cnt=3;
        }
        for(int i=cnt;i<n-1;i+=2)
        {
           cout<<a[i+1]<<" "<<-a[i]<<" ";
        }
        cout<<endl;

    }
    return 0;
}

标签:训练,10.27,int,个数,cin,long,数组,include
来源: https://blog.csdn.net/m0_46596968/article/details/121000945