HRBU_20211105训练

HRBU_20211105训练

A - Three Piles of Candies

题意

有三个数量不相等的糖果的盒子,Alice和Bob都想要得到尽可能多的糖果,条件是两个人的糖果数量都必须相等,例如有糖果 1 3 4,一个人拿第三个盒子的糖果,另一个人拿第一和第二个盒子,这样他们俩得到的糖果数量都相等,当是一个人的数量比另一个人数量多一时,数量多的人丢弃一个糖果,这样糖果数量时相等的,问两个人最多可以得到多少糖果。

思路

把所有糖果的数量相加除以2,即可得到最多可以得到的糖果。

代码

#include<stdio.h>
#include<iostream>
#define ll long long
using namespace std;
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        ll a,b,c;
        cin>>a;cin>>b;cin>>c;
        ll ans=(a+b+c)/2;
        cout<<ans<<endl;
    }
    return 0;
}

B - Odd Sum Segments

题意

把一组数据,分成k组,要求每个k组的和为奇数,问是否可以分组成功,若成功输出分组结果,否则输出NO.

思路

首先确定这组数有多少个奇数,奇数的个数必须大于等于k,因为至少得含有k个奇数,这里可以忽略偶数的存在,奇数个奇数相加得为奇数,其次一个重要的点怎么确定是存在分组的,是判断都有奇数个且分组是奇数时。

代码

#include<stdio.h>
#include<iostream>
using namespace std;
int a[200005];
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n,k;
        cin>>n;cin>>k;
        int sum=0,count=0,ans;
        for(int i=1;i<=n;i++)
        {
             cin>>a[i];
             if(a[i]%2==1)count++;
        }
        if(count%2 == k%2 && count>=k)
        {
            cout<<"YES"<<endl;
            k--;
            for(int i=1;i<=n && k>0;i++)
            {
                if(a[i]%2==1)
                {
                   cout<<i<<" ";
                    k--;
                }

            }
            cout<<n<<endl;
        }
        else
            cout<<"NO"<<endl;

    }
}

C - Robot Breakout

题意

题意主要是这个机器人逃生问题,所有的机器人是否能都逃生再同一个位置上,机器人有四个方向的操作,分为是左上右下,操作为1时代表可行,为零时代表不能有这个操作,例如1 0 0 0,表示机器人只能往左走,其他方向的操作都不可行。

思路

当操作的数都为1时,可以得出机器人可以到达任何位置,所以在这里我们只需要讨论操作为零时,机器人是否可以到达即可。
图有点丑,但是我相信你们能看懂

代码

#include<stdio.h>
#include<iostream>
#define inf 100000
using namespace std;
int x,y,a,b,c,d;
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n;
        cin>>n;
        int max_x=inf,min_y=-inf,min_x =-inf,max_y = inf;
        for(int i=0;i<n;i++)
        {
            cin>>x>>y>>a>>b>>c>>d;
            if(a==0) min_x=max(min_x,x);
            if(b==0) max_y=min(max_y,y);
            if(c==0) max_x=min(max_x,x);
            if(d==0) min_y=max(min_y,y);
        }
        if(min_x>max_x || min_y>max_y)
            cout<<"0"<<endl;
        else
            cout<<"1"<<" "<<max_x<<" "<<max_y<<endl;


    }
}

D - RGB Substring (easy version)

题意

这题是判断输入的字符串是否等于" RGBRGBRGB…",相等的部分是否有k个长度,如果没有需要修改几个字符才能相等。

思路

暴力枚举,因为它的题目的数据较小

代码

#include<stdio.h>
#include<iostream>
using namespace std;
char c[4]={'R','G','B'};
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n,k;
        cin>>n;cin>>k;
        string s;
        cin>>s;
        int ans=2000;
        for(int i=0;i<n-k+1;i++)
        {
            int num[4]={0};
            for(int t=0;t<k;t++)
            {
                if(s[i+t]!=c[t%3])num[0]++;
                //cout<<num[0]<<" ";
                if(s[i+t]!=c[(t+1)%3]) num[1]++;
                //cout<<num[1]<<" ";
                if(s[i+t]!=c[(t+2)%3])num[2]++;
                //cout<<num[2]<<" ";
            }
            ans = min(min(ans,num[0]),min(num[1],num[2]));
        }
        cout<<ans<<endl;
    }
}

总结

你真的别说,是真的好吃
学校的橘子这次是真的好吃,拿捏!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值