题意
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\n",ans); } return 0; }