2019 暑期杭电多校第 7 场1006 Final Exam / HDU 6651

探讨了一个关于分配考试复习时间的算法问题,目标是在有限的时间内通过k门考试,每门考试的复习时间与其分数相关。文章详细解析了如何在老师的恶意调整下,寻找最优的复习策略,以最小化总复习时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个很简单的思维题

居然写了这么久

打比赛真的是头脑不清醒

菜哭了,呜呜呜

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来聊一聊 1006 之 歹毒的老师不让我过考试

题意 : 有 n 门考试共享 m 分,你的目标是做出 k 个考试

          一个考试的分数为 x 时,你就要复习 x + 1 分钟

          现在这个歹毒的老师为了让你多复习,非常非常非常很刁钻的调整了各个科目的分数

          让你分配各个科目的考试时间,使得总时间最少

思路:

首先我们先考虑一种情况 : 当我们要过前 k 个考试的时候
这个 B 老师只分配 0 给前 k - 1 个考试
所以后面 cnt = n - (k - 1) 个考试我们就要复习很久
分数先分配成 m / cnt
因为可能存在除不尽的情况,
令 m / cnt 为 val1,
令 m / cnt + 1 为 val2,
那么后面 cnt 个考试的分数是 x * val1 + y * val2
通过取余数我们可以算出 y == m % cnt 个
那么 x == cnt - y

知道这 2 个 val,其实答案已经快出来了
因为我们弄 num2 个 val2
        弄 num1 个 val1
这个歹毒的老师肯定会让我们的 num2 几个去匹配它给的 0 分数的考试
最后剩下的分数他一定会按照 x * val1 + y * val2 去卡我们         ( 这样均值大,一大一小我们可以钻小分数的空子
此时我们就要做一件事情,相比原来的 x,y
我们增大 y
    减小 x 即可

 

#include<stdio.h>
typedef long long LL;
using namespace std;
const int N = 2e5 + 10;
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        LL n,m,k;
        scanf("%lld %lld %lld",&n,&m,&k);
        LL cnt = n - (k - 1);
        LL val1 = m / cnt;
        LL val2 = val1 + 1;
        LL num1 = cnt - m % cnt;
        num1 --; 
        LL num2 = n - num1;
        LL ans = val1 * num1 + val2 * num2;
        printf("%lld\n",ans);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值