一个很简单的思维题
居然写了这么久
打比赛真的是头脑不清醒
菜哭了,呜呜呜
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接下来聊一聊 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);
}
}