2019杭电多校第7场 1006 Final Exam HDU 6651(思维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651

 

题目大意:有n道题,共m分,要过k题,x分的题需要复习x+1分钟,最少需要复习多久能过

 

题目思路:比赛中被模拟题束缚(怎么会这么菜啊),结果一直到比完都不知道这题题意一直是俩队友在瞎搞,有个队友否定了自己的正解,有个队友二分极大值设的不够大,都是神仙,全队奥斯卡影帝。

二分做法刚才想了半天意识到自己已经忘了,那就算了吧..
公式法就是,如果想过k题,那么n-k+1题至少得过一题,然后再来k-1题全过就能美滋滋。至少过一题的话只要总和比m大一点他就无能为力了,也就是m+1,剩下的题需要比刚才的题都要牛B或者一样牛B,否则要是这些题被选中就凉了,要保证能过,那就是跟那n-k+1里的最厉害的那家伙一样就行,想让答案尽可能小也就是让那家伙尽可能菜,那就需要平均分他的力量,就是(m+1)/(n-k+1),但是要比那家伙强或者一样强,所以需要向上取整。所以最后的答案就是m+1+(k-1)*ceil((m+1)/(n-k+1))

 

以下是代码:

#include
#include
using namespace std;
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const int MAXN = 5e5+5;
const int MOD = 1e9+7;
int main()
{
    int t,n,m,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        printf("%lld\n",(k-1)*(ll)ceil(1.0*(m+1)/(n-k+1))+m+1);
    }
    return 0;
}

 

 

 

你可能感兴趣的:(思维)