6 条题解

  • 4
    @ 2024-5-27 16:51:16

    二分+贪心

    #include <bits/stdc++.h>
    using namespace std;
    #define Fe(i, l, r) for(int i = l; i <= r; ++ i) // 定义循环宏
    const int N = 500005;
    
    int w[N], a, b, n;
    int W[N];
    
    // 检查在x秒内是否能够将所有衣服晒干
    bool check(int x){
        Fe(i, 1, n){
            W[i] = w[i];
            // 计算每件衣服减去自然晒干后剩余的湿度
            W[i] = W[i] - a * x;
        }
    
        int sum = 0;
        Fe(i, 1, n){
            if(W[i] <= 0) continue; // 若衣服已经干了,则跳过
            // 计算若使用烘干机则需要的时间
            sum += W[i] / b;
            if(W[i] % b) sum += 1; // 如果还有剩余湿度,需要额外的时间
            if(sum > x) return 0; // 如果所需时间超过x,则说明在x秒内无法完成晒干
        }
        return 1;
    }
    
    int main(){
        ios::sync_with_stdio(0); cin.tie(0);
        cin >> n >> a >> b;
        Fe(i, 1, n){
            cin >> w[i]; // 输入每件衣服的湿度
        }
    
        int l = 0, r = N - 2;
    
        // 二分查找,找到晒干所有衣服所需的最少时间
        while(l < r){
            int mid = (l + r) >> 1;
            if(check(mid)){
                r = mid; // 如果可以在mid时间内晒干,尝试缩小时间
            } else {
                l = mid + 1; // 否则增加时间
            }
        }
        cout << l << endl; // 输出最少所需时间
        return 0;
    }
    

    信息

    ID
    936
    时间
    3000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    576
    已通过
    38
    上传者