题目描述:
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;
}