U267430 烙饼(思维)

93 阅读2分钟

U267430 烙饼 - 洛谷

原题题面

image.png

题目描述

n(1n109)n(1\le n \le 10^9) 台烙饼机,m(1m105)m(1 \le m \le 10^5) 张饼,每张饼的烙制时间为 a(1a105)a(1\le a \le 10^5) 每张饼在烙制的周期内可以在多台烙饼机上进行,且进行烙饼机的切换不消耗时间。

求烙制完 nn 张饼的最小时间。

样例输入 #1

2 3
3 3 5

样例输出 #1

5.5000

样例输入 #2

2 3
10 3 2

样例输出 #2

10.0000

题目分析

首先我们知道,烙饼的最小时间不应少于 mm 张饼中烙制时间最长的饼,将这个值记为 mxmx,因为若最小时间小于 mxmx,则意味着有一张饼无法完成自己的烙制周期(饼不能切开在不同的烙饼机上烙制)。

然后,我们先求得 mm 张饼的总时间与烙饼机总台数 nn 的比值 aveave

我们先讨论 ave>mxave > mx 的情况,在这种情况下其实有一个隐含条件,即 n<mn < m。在此我们先给出结论,即最终的烙饼时间为 aveave,我们先想象下 nn 张饼排成一队,依次进入烙饼机。在当前烙饼机(记为 11 号机)未工作至时间 aveave 时,队伍的下一张饼(记为饼 xx)进入 11 号机,若在时间 aveave 到达时未烙制好当前饼,则将其放置下一台烙饼机(记为 22 号机)的初始时间烙制,这也便意味着其实饼 xx 在时间线上首先在 22 号机烙制,在烙制一定时间后取出,然后等待一定时间后(因为 1,21,2 台机的烙制饼 xx 的总时间一定小于 aveave)再转移至 11 号机。由于每张饼的烙制时间小于 aveave,则不存在一张饼同时在多台烙饼机烙制。最终所有烙饼机的工作时间均为 aveave,所有饼也被烙制完毕。

avemxave \le mx,我们将烙制时间大于 aveave 的饼单独拿出,其中的每一张饼无论在哪个时间段的哪台烙饼机上烙制,最终完成总时间一定大于 aveave。这也便意味着我们可以单独为其分配烙饼机,而剩下的饼的平均烙制时间又小于 aveave,可以按上一情况分配,可以保证在 aveave 的时间内用剩下的烙饼机烙制完成,最终答案为 mxmx

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;
}