牛客练习赛117

C.Kevin的抱团游戏

思路:当k是偶数时一定可以全由女生构成或偶数个男生和女生构成所以可以假设所有的男生都参与了,(n + 2* m) % k得到如果是奇数则说明有一个男生和若干个女生(优先使用男生)如果得到得是偶数就全当女生。

当k是奇数时肯定是奇数个男生和若干个女生也就是每组都需要一个男生

之所以要分开是因为当k为奇数时可能会把一个女生分到两个组

#include<bits/stdc++.h>
#define Max 0x7fffffff
#define  LL long long
#define  ULL unsigned long long
#define N 2000005
#define int  long long
int mod = 65536;
using namespace std;
signed main() {
    int T; scanf("%lld", &T);
    while (T--) {
        int n, m, k, ans = 0; scanf("%lld%lld%lld", &n, &m, &k);
        if (k == 1)ans = m;
        else {
            int left, p;//left是剩余人数,p是可以分成多少组
            if (k % 2) {
                p = min(n, (n + 2 * m) / k);//因为是奇数每组最少一个男生也就是n组,(n + 2 * m) / k是计算组数的
                left = (n + 2 * m) - p * k;//剩余人数计算
                if (left % 2) {//如果是奇数就一定是有一个男生是多余的
                    ans++;
                    left--;
                }

            }
            else {
                left = (n + 2 * m) % k;
                if (left % 2) {
                    left--;
                    ans++;
                }
            }
            ans += min(left / 2, m) + max(0ll, left - 2 * m);//由于left一定是偶数,所以前一部分是计算剩余女生的数量
                                                             //如果所有女生都满足不了剩余人数就用女生补,所以后一部分是计算剩余男生数量
        }
        printf("%lld\n", ans);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值