2019HDU多校第七场 HDU6651 Final Exam

一、题目

   Final Exam 

二、分析

  题目说的比较绕,总之一定要记住,$n$个题目都可以做,至少作对$k$到,但是做题目的人不知道每道题对应的分数。

  作为出题人,如果他是田忌,肯定不会去在做题目的人可能会做对的$k-1$道题目上去放分,这样的话出题目的人可以使剩下的$n-k+1$道题的分尽可能大,从而防止学生做出$k$道题。

  那么作为出题人,能摆出的最优情况就是$frac{m}{n-k+1}$或者大于$frac{m}{n-k+1}$的$n-k+1$个题目分,总和肯定还是$m$。(如果是出题人,应该还会在保证这$n-k+1$个题目除了一个题目,其他都是$frac{m}{n-k+1}$,因为这样能卡掉的可能性最大)

  作为做题人,对于这$n-k+1$个数,在最坏情况下(相对于出题人就是最优),做题人是必须要至少做一道题出来,那么相当于就是肯定要至少花$m+1$的时间去复习(我认为就是在最坏情况的最大分值上+1,这样是肯定可以保证这$n-k+1$道题我可以做出来至少1道的,$n-k+1$中的其他题目复习时间就等于$frac{m}{n-k+1}$,这个也是必须要保证的,因为作为做题人不知道自己复习的最好的是否就一定是分数最大的,并且可能刚好剩下的$n-k+1$中的题目没有复习到平均值的时间,出题人就可以把没有加到平均值剩余分数全部加到一个上面去,让你复习最多的也过不了,这样你就做不到$k$题了)。

  再回到出题人肯定认为我们能做出来的$k-1$道题,为了保证在我不知道自己会做多少分的题目的情况下,我肯定要做出$k$道题,那么这$k-1$道题的复习时间最优就是$frac{m}{n-k+1} + 1$。比最优的小,出题人是可以调换题目的分值分布让做题人过不了$k$题的。

  所以最终结果就是$${(frac{m}{n-k+1} + 1)} imes{(k-1)} + m + 1$$

三、AC代码

#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define Min(a,b) ((a)>(b)?(b):(a))
#define Max(a,b) ((a)>(b)?(a):(b))

/*
3
1 10 1
10 109 10
10 101 9
*/

int main()
{
    //freopen("input.txt", "r", stdin);
    int T;
    while(scanf("%d", &T) != EOF)
    {
        ll n, m, k;
        while(T--)
        {
            scanf("%lld%lld%lld", &n, &m, &k);
            ll d = m / (n - k + 1);
            ll ans = (d + 1) * (k - 1) + m + 1;
            printf("%lld
", ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dybala21/p/11347018.html