2019 杭电多校训练 第七场1006 Final Exam(6651)

2019 杭电多校训练 第七场1006 Final Exam

题目

http://acm.hdu.edu.cn/showproblem.php?pid=6651

题意

这次考试将是一个题共分M分的考试。QQ不知道确切的分布。当然,不同的问题可能有不同的分;在某些极端情况下,一些问题可能值0分,或者所有M分。分必须是整数;问题不能有0.5点。
他所知道的是,这些n个问题将涉及n个完全不同的主题。例如,一个可能是测试您对动态编程的理解,另一个可能是关于19世纪中国历史的。所以他必须把你的夜晚分开来分别准备每一个主题。另外,如果一个问题在明天的考试中值X分,那么至少需要X+1小时来准备考试所需的一切。如果他花不到x+1小时准备,他将在这个问题上失败。

奇怪的是,QQ的目标并不是尽可能多的分数,而是要解决至少k个问题,不管试卷是什么样的,以摆脱父母的责骂。所以他想知道至少需要多少小时才能达到这个目标。
题目输入n,m,k分别对应n个题目,m为总分,QQ想要做对k道题目。

题解

一看这个题目就感觉是田忌赛马呀!假设我们是坏坏的老师,我们已经知道了学生复习的时间分布。拿例子 10 10 2来说:
假设学生复习每道题的时间为: 1 1 1 1 1 1 1 1 2 2(看来这个学生想做对最后两题)
那我们看到学生复习时间后果断把题目分值改为:1 1 1 1 1 1 1 1 2 0呀!意思就是允许学生做对复习时间较多的k-1道题,剩下的题目分值全部都设置在和学生复习时间一样的情况,那学生就GG了。
没错!作战就是要知己知彼!既然我们知道了老师这么有心机,那我们要是是学生的话,就可以把复习时间改为:1 1 1 1 1 1 1 2 2 2老师无论如何也是阻止不了我们写对k题的,哈哈哈哈。
我的思路如下:我现在需要着重k-1道题,这k-1道题的分值为 (m/(n-k+1)+1)
为什么是 (m/(n-k+1)+1) 呢?因为坏老师可以放掉学生k-1个复习时长最多的题目,这样剩下的n-k+1个题目就可以用m分来随机分配了。所以我们用 (m/(n-k+1)+1) 来计算这些做多复习时长的最小值了,老师放完k-1道题之后还剩下m分和n-k+1道题,我们n-k+1道题的复习时间为m/(n-k+1),然后随便一道题多复习一个小时就可以了。最后约分算出来n-k+1道题复习时间就是m+1。所以答案为 (m/(n-k+1)+1) (k-1)+m+1

代码

#include<stdio.h>
#define ll long long
int T;
ll n,m,k;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld %lld %lld",&n,&m,&k);
        printf("%lld\n",(m/(n-k+1)+1)*(k-1)+m+1);
    }
    return 0;
}
发布了51 篇原创文章 · 获赞 16 · 访问量 3367

猜你喜欢

转载自blog.csdn.net/weixin_43911945/article/details/99428035