HRBU_20211027训练

HRBU_20211027训练

A - Luntik and Concerts

题意

一共有三种时间的歌曲,a个一分钟,b个两分钟,c个三分钟,把这些歌曲分为两组,要求两组的时间相差最短。

思路

把所有的时间相加求和,判断是奇数还是偶数,若是奇数相差1,若为偶数,则相差0.

代码

#include<stdio.h>
#define ll long long
#include<iostream>
using namespace std;
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int a,b,c;
        cin>>a;cin>>b;cin>>c;
        ll sum=a*1+b*2+c*3;
        if(sum%2!=0)
          cout<<"1"<<endl;
        else
          cout<<"0"<<endl;
    }
}

B - Luntik and Subsequences

题意

求所有的输入之和是否可以去掉一个数得到和-1

思路

我们可以任意选择一个1,所以有多少个1就有多少个选择,其次是统计0的个数,0的存在就有两个可能,可以加上0也可以不加0,所以可以得到一个公式是1的个数用a表示,0的个数用b表示,公式是a*2^b.

代码

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int a[100];
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n;
        cin>>n;
        long long sum=0;
        for(int i=0;i<n;i++)
        cin>>a[i];
        int num0=0,num1=0;
        for(int i=0;i<n;i++)
        {
    
    
        if(a[i]==0)num0++;
        if(a[i]==1)num1++;
        }
        sum=num1*pow(2,num0);
        cout<<sum<<endl;

    }
}

C - Grandma Capa Knits a Scarf

题意

求一个序列去除几个字母后称为一个对称的子序列,例如,
abcaacab,去掉头尾的两个b,就变成了acaaca.

思路

从a开始遍历到z,判断a[l]==a[r]是否相等,如果相等,就是l++,r–;如果是a[l]!=a[r],a[l]==c,就是跳过左侧的字母,l++,res++;
同理,右边也是。

代码

#include<stdio.h>
#include<iostream>
using namespace std;
int check(string str,char c)
{
    
    
    int l=0,r=str.length()-1;
    int res=0;
    while(l<r)
    {
    
    
        if(str[l]==str[r]){
    
    l++;r--;continue;}
        if(str[l]!=str[r] && str[l]==c){
    
    l++;res++;continue;}
        if(str[l]!=str[r] && str[r]==c){
    
    r--;res++;continue;}
        return 1e6;
    }
    return res;
}
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n,ans=1e6;
        cin>>n;
        string str;
        cin>>str;
        for(char i='a';i<='z';i++)
        ans=min(ans,check(str,i));
        cout<<(ans==1e6?(-1):ans)<<endl;
    }
}


D - Vupsen, Pupsen and 0

题意

这题的题意简单,答案是不唯一的,输入的数字输出的数相乘相加要等于零即可。

思路

本题主要是考虑分奇偶数就可以,当是奇数时,分别提出三个数,例如是x,y,z,那么要使他们的和为零,输出是,-z,-z,x+y.当数是偶数时,只需要时交换乘以-1,就可,例如,n,m,只需乘以-m,n即可。

代码

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        int n;
        scanf("%d",&n);
        if(n%2==1)
        {
    
    
            int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            n=n-3;
            if(x+y!=0)printf("%d %d %d ",-z,-z,x+y);
            else if(x+z!=0)printf("%d %d %d ",-y,x+z,-y);
            else
                printf("%d %d %d ",y+z,-x,-x);
        }
        while(n>0)
        {
    
    
            int a,b;
            scanf("%d %d",&a,&b);
            printf("%d %d ",-b,a);
            n=n-2;
        }
        printf("\n");
    }
}

总结

无论过去时悲伤还是喜乐,已一去不复返。
无论是未来时辉煌还是黯淡,一切都是未知的。

猜你喜欢

转载自blog.csdn.net/MarigoldLi/article/details/121003762
今日推荐