Educational Codeforces Round 73 (Rated for Div. 2) C. Perfect Team

本文探讨了在给定a、b、c元素数量的情况下,如何通过贪心算法和二分查找来寻找能够组成的最多三元组数量。重点介绍了算法的实现思路与代码细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一个三元组至少包含一个a,一个b,现给你a,b,c的个数,问最多能组成几个三元组?

思路:从贪心的角度看,三元组<a,b,c>是最优的,当a-min(a,b,c)==0 || b-min(a,b,c)==0,则答案是min(a,b)

对剩下的a,b,我假设它们能组成的三元组个数为x0,则可以得到三个不等式 1) a-x0>=0  2)b-x0>=0  3)a+b-3x0>=0,可以考虑二分x0的个数,x0合法当且仅当满足这三个不等式

#include<cstdio>
#include<algorithm>
using namespace std;
bool solve(int x, int y, int x0) {
    if(x - x0 < 0 || y - x0 < 0 || x + y - 3 * x0 < 0 )
        return false;
    return true;
}
int main() {
    int n;
    scanf("%d", &n);
    while(n--) {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        int p = min(x, min(y, z));
        x = x - p;
        y = y - p;
        if(!x || !y)
            printf("%d\n", min(x, y));
        else {
            int L = 1;
            int R = max(x, y);
            while(L <= R) {
                int M = (L + R) / 2;
                if(solve(x, y, M))
                    L = M + 1;
                else
                    R = M - 1;
            }
            printf("%d\n", L - 1 + p);
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值