原题题面
题目描述
有 台烙饼机, 张饼,每张饼的烙制时间为 每张饼在烙制的周期内可以在多台烙饼机上进行,且进行烙饼机的切换不消耗时间。
求烙制完 张饼的最小时间。
样例输入 #1
2 3
3 3 5
样例输出 #1
5.5000
样例输入 #2
2 3
10 3 2
样例输出 #2
10.0000
题目分析
首先我们知道,烙饼的最小时间不应少于 张饼中烙制时间最长的饼,将这个值记为 ,因为若最小时间小于 ,则意味着有一张饼无法完成自己的烙制周期(饼不能切开在不同的烙饼机上烙制)。
然后,我们先求得 张饼的总时间与烙饼机总台数 的比值 。
我们先讨论 的情况,在这种情况下其实有一个隐含条件,即 。在此我们先给出结论,即最终的烙饼时间为 ,我们先想象下 张饼排成一队,依次进入烙饼机。在当前烙饼机(记为 号机)未工作至时间 时,队伍的下一张饼(记为饼 )进入 号机,若在时间 到达时未烙制好当前饼,则将其放置下一台烙饼机(记为 号机)的初始时间烙制,这也便意味着其实饼 在时间线上首先在 号机烙制,在烙制一定时间后取出,然后等待一定时间后(因为 台机的烙制饼 的总时间一定小于 )再转移至 号机。由于每张饼的烙制时间小于 ,则不存在一张饼同时在多台烙饼机烙制。最终所有烙饼机的工作时间均为 ,所有饼也被烙制完毕。
若 ,我们将烙制时间大于 的饼单独拿出,其中的每一张饼无论在哪个时间段的哪台烙饼机上烙制,最终完成总时间一定大于 。这也便意味着我们可以单独为其分配烙饼机,而剩下的饼的平均烙制时间又小于 ,可以按上一情况分配,可以保证在 的时间内用剩下的烙饼机烙制完成,最终答案为 。
Accept代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
double n, m;
cin >> n >> m;
double sum = 0, mx = 0;
for (int i = 0; i < m; i ++)
{
double x; cin >> x;
sum += x;
mx = max(mx, x);
}
printf("%.4f", max(sum / n, mx));
return 0;
}