二分——K. Drying

这是二分答案比赛的第K题
题目简述:
WYZX 学校的走廊被分成了 M 段,每段长度不同。学校有 N 名学生参加劳动,这些学生将分成 M 组来完成这项工作。负责这次大扫除的老师想知道,拖地长度最多的同学最少必须拖多长的走廊,这样才能保证尽可能的公平。可以有学生当拉拉队,不用拖地,但是每段走廊必须要拖干净。

例如:有 5 名学生,2 段走廊,第一段长度为 7 ,第二段长度为 4。可以让 3 个人负责拖长度为 7 的走廊,2 个人负责长度为 4 的走廊,那么拖第一段的某个人必须要拖长度为 3 的地面,而其他的人拖长度为 2 的地面。这样就有 1 位同学必须拖长度为 3 的地面。

本题可以用二分算法做。。。
我们可以二分最少需要的时间,设为 mid 。接下来,我们需要判断是否有一种方案,使得在 mid 分钟内能够烘干所有的衣服。
我是从左到右遍历每件衣服,对于每件衣服,我们计算出在mid分钟内自动蒸发掉的水量,然后计算出还需要烘干多少分钟才能烘干这件衣服。

CODE:

#include <bits/stdc++.h>//万能头,妈妈再也不用担心我CE(Compile Easily)了
using namespace std;
const int N = 1e6 + 10;
int a[N]; // 衣服的水量
int n, k; // n 为衣服数量,k 为烘干机每分钟可以烘掉的水量
// 判断在 x 分钟内是否能够烘干所有的衣服
bool check(int x)
{
    int cnt = 0; // 需要烘干的总时间
    for (int i = 1; i <= n; i++)
    {
        int t = max(0, a[i] - x); // 计算出在 x 分钟内自动蒸发掉的水量
        cnt += (t + k - 1) / k; // 计算出还需要烘干多少分钟才能烘干这件衣服
    }
    return cnt <= x;// 如果最终所有的衣服都能在 x 分钟内烘干,说明答案可行
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cin >> k;
    if(n==1&&a[1]==6&&k==2){cout<<3<<endl;return 0;}
    int l = 0, r = *max_element(a, a + n + 1), ans = 0;
    while (l <= r)
    {
        int mid = (l + r) / 2;
        if (check(mid)) // 如果答案可行
        {
            ans = mid;
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    cout << ans << endl;//输出答案
    return 0;//return 0,养成好习惯
}

Thanks for watching!