题意
n个题一共m分,出题人可以任意分配每个题的分数,对于x分的题,需要复习x+1分钟,问如果能做出k道题最少需要几分钟。
思路
利用田忌赛马的思路,出题人至少要赢下n-k+1局,最优策略是先用0分的题和最大的k-1个数比较,集中兵力赢下n-k+1局,作为做题人,我们如果想要阻止出题人,需要在最少的n-k+1个题分配m+1分钟,这样无论如何出题人用m分钟无法赢下这n-k+1局。问题转化为如何用最小的时间,使得任意k个数的和大于等于m+1。令x=(m+1)/(n-k+1),若不能整除,剩下k-1个数填x+1,否则剩下k-1个数填x就足够了。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,m,k;
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%lld%lld%lld",&n,&m,&k);
LL x=(m+1)/(n-k+1);
LL ans;
if ((m+1)%(n-k+1)==0) ans=(k-1)*x+m+1; else ans=(k-1)*(x+1)+m+1;
printf("%lld
",ans);
}
return 0;
}