U267430 烙饼(思维)

131 阅读2分钟

U267430 烙饼 - 洛谷

原题题面

image.png

题目描述

有 n(1≤n≤109)n(1\le n \le 10^9) 台烙饼机,m(1≤m≤105)m(1 \le m \le 10^5) 张饼,每张饼的烙制时间为 a(1≤a≤105)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,所有饼也被烙制完毕。

若 ave≤mxave \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;
}