洛谷P11510 [ROIR 2017 Day 2] 自动管理系统题解
题目简要概述:
有若干包裹重量为 1 到 k,将一些包裹装进包裹袋中,若包裹袋重量 \geq x,那么会将这一个包裹袋放进一个集装箱,若集装箱里面的所有包裹袋重量之和 \geq y 则可配送。问:当集装箱可以配送时,最小重量是多少?
分析:
对于每个包裹袋被放进集装箱的可能性为 x 到 x + k - 1,若每个包裹袋的重量都以最大的可能性被装进集装箱,且集装箱的重量要最小,那么最大的情况就一定要最小,所以当每个包裹袋都以最大的重量放进集装箱时,只要重量 \geq y 就没有必要再放进其他的包裹袋,这个重量就是它的上限 R。即:
s = \lceil y \div (x + k - 1) \rceil
R = s \times (x + k - 1)
那如何确定它的下限呢?非常简单,设我们用了 s 个重量最大包裹袋放进了集装箱,那么我们把重量最大的包裹袋全部换为重量最小的包裹袋也一定是可以放进集装箱的,这样装进集装箱的总重量就是它的下限。我们用 L 表示它的下限,即:
L = s \times x
那么答案就在 L 和 R 之间,因为我们能够保证 R > y 。所以我们就拿 L 与 y 取较大值,即答案。
贴心附上代码
#include<bits/stdc++.h>
using namespace std;
long long n,x,y,s,k;
int main() {
cin>>n>>x>>y;
k=x+n-1;
if(y%k==0) s=y/k;
else s=y/k+1;
s*=x;
cout<<max(s,y);
return 0;
}