HRBU_20211025训练

A - Elections

题意:

三个人选举,,已知三个人目前已有的票数分别是A,B,C,问如果某一个人想要胜出,也就是说他的票数得比其他两个人多,那么最少需要多少票?分别输出三个人所需要的票数。

做法:

三个人里面最大值+1减去本身就是需要的最小票数,但是得注意这个最大值是否就是本身,因为自身是最大值时,就不需要再增加票数就已经胜出了。至于为啥WA了三次。。。只能说限制条件真的得好好写呀!!!QAQ!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll a,b,c,t;
    cin>>t;
    while(t--)
    {
        cin>>a>>b>>c;
        ll maxx=max(a,max(b,c));
        if(a==maxx&&b!=maxx&&c!=maxx)
            cout<<0<<" ";
        else
            cout<<maxx+1-a<<" ";
        if(b==maxx&&a!=maxx&&c!=maxx)
            cout<<0<<" ";
        else
            cout<<maxx+1-b<<" ";
        if(c==maxx&&b!=maxx&&a!=maxx)
            cout<<0<<endl;
        else
            cout<<maxx+1-c<<endl;
    }
    return 0;
}

B - Make it Divisible by 25

题意:

给定的数字,你可以删除这个数字某一些数位上的数字,然后让原本的数字变成一个全新的数字(前导零的情况数字还是可以的,题目帮着把前导零给去了,所以不用在意),我们需要做的就是把这个数字变成一个25的倍数,最少需要执行几次删除数字的操作?

做法:

25的倍数:25,50,75,100,125,150,175,200.....很明显我们发现25的倍数最低位上必定是00或者25或者50或者75,前面都不需要care!所以判断最后两位即可,推荐把n变成字符串更好操作

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string n;
        int cnt1=0,cnt2=0,flag=0;
        cin>>n;
        for(int i=n.size()-1;i>=0;i--)
        {
            cnt1++;
            if(!flag&&n[i]=='0')
            {
                flag=1,cnt1--;
                continue;
            }
            if((n[i]=='0'||n[i]=='5')&&flag)
            {
                cnt1--;
                break;
            }
        }
        flag=0;
        for(int i=n.size()-1;i>=0;i--)
        {
            cnt2++;
            if(!flag&&n[i]=='5')
            {
                flag=1,cnt2--;
                continue;
            }
            if((n[i]=='2'||n[i]=='7')&&flag)
            {
                cnt2--;
                break;
            }
        }
        cout<<min(cnt1,cnt2)<<endl;
    }
    return 0;
}

C - Save More Mice

题意:

现在有一个数轴从0~无穷,0的位置上有一只猫,然后一共有K只老鼠分布在这个数轴上,在N这个位置有一个鼠洞(老鼠的家)每一次你可以先把一个老鼠移动1,然后在把猫移动1。当猫到达某个位置时,如果这个位置上有老鼠,那么猫会吃掉这位置上的所有老鼠!问最后能有几只老鼠到达N这个位置。活着真难!!!

做法:

试想一下,猫一直都在动,而你每次只能移动一只老鼠,那么是不是从位置最大的老鼠开始移动就可以保证至少可以救下来1只呢,因为老鼠和猫同时移动且每次移动距离相同,猫永远抓不到这只老鼠,所以最优解的情况就是从最大位置的开始移动,同时把猫推进,当猫的位置大于等于你当前要移动的老鼠位置时,就是最大能救下的老鼠个数啦!贪!贪心就完事了!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,k;
        int pos[maxn];
        cin>>n>>k;
        for(int i=1;i<=k;i++)
            cin>>pos[i];
        sort(pos+1,pos+1+k);
        int x=0,cnt=0;
        while(x<pos[k])
        {
            x+=(n-pos[k]);
            k--,cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}
/**
9 8 7 5 4 4   0
8 7 5 4 4     1
9 7 5 4 4     2
7 5 4 4       3
8 5           4
9             5
              6
*/

D - All are Same

题意:

给定一个数组,你可以把数组里任意一个元素进行减法操作(把这个数字-K)题目要求最后你要得到一个只存在一个数字的数组,问这个K最大是多少?减法操作可以进行无数次

做法:

你要保证所有数据都能变成一个值且只通过减法操作,那这个值只能是最小值了呀,没有毛病吧?其次反正你可以操作无数次减法,那么是不是只要关注最大值和最小值的差值就行呢?当然~不是!其他值怎么办,万一根本操作不出来呢?就比如某个值到最小值的差,比你一开始求的差值都要小,这样根本不成立嘛。OMO所以咱就需要去寻找每一个数到最小值的差值的最大公约数呀!这样在保证每一个数据都能到最小值的同时保证的答案的最大化注意!当数组里只存在一个数字时!!!也就是说最大值最小值的差值为0的时候输出-1!!!QAQ又在这死了一发,就离谱!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,a[50];
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        int ans=a[n]-a[1];
        if(ans==0)
        {
            cout<<-1<<endl;
            continue;
        }
        for(int i=n-1;i>=2;i--)
            ans=__gcd(a[i]-a[1],ans);
        cout<<ans<<endl;
    }
    return 0;
}
/**

*/

至于E,下次一定!(开玩笑,明天就补!)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值