AT_ARC158A 解题报告
题意
给你3个数 \(a,b,c\),通过若干次操作使得 \(a=b=c\)。
一次操作指将 \(a,b,c\) 按任意顺序分别 \(+3,+5,+7\)。
若可以使 \(a=b=c\),输出最小操作次数,否则输出 \(-1\)。
思路
我们可以将 \(+3,+5,+7\) 每一项都减去 \(5\) 得到 \(-2,0,+2\)。
题目也就转变成了将三个数其中一个加上 \(2\),另外一个减去 \(2\),最终能否是三个数相同。
既然题目说有无法使三个数相等的情况,我们就先来考虑什么时候会使这三个数不相等。
-
因为三个数中一个加上 \(2\),另一个减去 \(2\),所以它们的和是没有变的,而三个数最终又要相等,我们可以得到这三个数的和一定为三的倍数(否则最终变化后的结果就不为整数了)。
-
根据同余可以得到:任何一个数加上一个偶数奇偶性不会改变,所以这三个数的奇偶性就必须相同(否则最终无法变化成三个奇偶性相同且相等的数)。
再排除完上述不可能情况后,只用求出三个数最终变化后的结果 \(mid\),再取 \(a,b,c\) 分别减去 \(mid\) 的绝对值的最大值就好了。
这个数据范围要做什么不用我多说了吧。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t, a, b, c;
signed main() {
scanf("%lld", &t);
while (t--){
scanf("%lld%lld%lld", &a, &b, &c);
if (!(a % 2 == b % 2 && b % 2 == c % 2)){//奇偶性判断
printf("-1\n");
continue;
}
if ((a + b + c) % 3 != 0){//余数判断
printf("-1\n");
continue;
}
int mid = (a + b + c) / 3;
printf("%lld\n", max(abs(mid - a), max(abs(mid - b), abs(mid - c))) / 2);//答案
}
return 0;
}
标签:三个,ARC158A,报告,奇偶性,mid,解题,printf,lld
From: https://www.cnblogs.com/ccf-ioi/p/17871581.html