AT_ARC158A解题报告

发布时间 2023-12-02 14:41:53作者: CCF_IOI

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\),最终能否是三个数相同。

既然题目说有无法使三个数相等的情况,我们就先来考虑什么时候会使这三个数不相等。

  1. 因为三个数中一个加上 \(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;
}