HDU6651 Final Exam

题意

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;
}
posted @ 2019-08-29 20:09  zhanggengchen  阅读(93)  评论(0编辑  收藏  举报