这场是一场手速场...就是各位大佬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;
}