window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

AT_ARC158A解题报告

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;
}
posted @   CCF_IOI  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示