Atcoder Beginner 093 C 解题报告

这场是一场手速场...就是各位大佬A得飞快,我这种辣鸡...就很辣鸡...首先本人代码能力并不高...做题又慢...唉...最讨厌手速场了...说多了都是泪...T_T

尽管A掉了三题,却排到700+...只涨了3分..........姑且说下C题吧...其实我C题一点没卡,一发AC...B题数组越界查bug查了一万年,A题开多组挫掉,抹掉多组秒A...唉,还是我能力差的缘故...不过相比去年,还算是有进步了。毕竟去年的我At还做不到C题,在校acm集训队里跟着各位大佬训练也算是没太糟糕。下面进入正题,说下C题题意:

给三个数,要求进行若干次操作使三个数相等,操作分为两种:

第一种是选两个数,同时加1; 第二种是选一个数,进行加2

问:最少需要多少步操作是三个数相等。


思路:

我先将这三个数存进t数组中,然后进行一次 sort 快排,找出最大值t[3],晾一边不管,然后找次大值,即t[2], 算出最大与次大的差值,即第一种操作所执行的次数,然后再看最小值t[1],由于t[1]和t[2]同时进行加1操作,在t[2]变到t[3]的过程,t[1]也变为t[1] + tmp这个值,其中tmp为t[3] - t[2]。然后对新的t[1]进行第二种操作,故令t0 = t[3] - (t[1] + tmp),再判断奇偶,目的是确定进行了多少次第二种操作,t0如果是偶数,第二种操作就进行了t0 / 2次,如果是奇数, 就对t[3]和t[2]同时加1,即对,t[3]和t[2]进行第一种操作,再对t[1]进行第二种操作,此时总操作数需要加2 。核心思想如上,代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
int a, b, c;
int t[5];

int main() {
    while(~scanf("%d %d %d", &a, &b, &c)) {
        int cnt = 0;
        t[1] = a, t[2] = b, t[3] = c;
        sort(t + 1, t + 4);
        int max = t[3];
        int tmp = t[3] - t[2];
        cnt += tmp;
        int tmp0 = t[3] - (t[1] + tmp);
        if(tmp0 & 1) {
            cnt += tmp0 / 2;
            cnt += 2;
        }
        else cnt += tmp0 / 2;
        printf("%d\n", cnt);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值