A. Berland Poker &1000【简单数学思维】

题目描述:

n张卡片中有m个王,一共k个人打牌。每个人取n/k张牌(保证整除),将最大和次大间的差值最大化(提炼后的)

错误思路:

坚决杜绝:if....输出一个答案;if......输出答案

正解:

像解数学题一样解出来,如果要得到答案,我需要哪些要素?对于这些要素再逐个击破。

其实将最大和次大间的差值最大化这样的提炼已经能帮助我解题了。

最大值直接能定下来,要么是m,要么是n / k。最大值同时小于等于二者,所以要取min

当最大值确定下来后,次大值同理,有一个上取整的操作。

        int theirs = (m - our + k - 2) / (k - 1);//对谁上取整,加上分母-1
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
 
int main(){
	std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
 	int t;
 	cin >> t;
 	while(t -- ){
 		int n, m, k;
 		cin >> n >> m >> k;
 		int our = min(n / k, m);
 		int thiers = (m - our) / (k - 1);
        //手工上取整
 		if((m - our) % (k - 1) != 0) {
 			thiers ++;
 		}
 		cout << our - thiers << '\n';
 	}   
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值