题解:CF1498B Box Fitting

· · 题解

题目大意

要求找到一个最小高度的二维盒子,使得 n 个给定的宽度为 2 的方幂的长条能够在不旋转、不重叠的情况下放入宽度为 w 的盒子之中。

题目解法

给出代码

#include <bits/stdc++.h>
using namespace std;
int t, n, w, a[100005];
int calc (int h){
    priority_queue <int> q;
    for (int i = 1; i <= h; i++)
        q.push (w);
    for (int i = 1; i <= n; i++){
        if (q.top() < a[i] || q.empty()){
            return 0;
        }
        if (q.top() > a[i]){
            q.push (q.top() - a[i]);
            q.pop();
        } 
        else{
            q.pop();
        }
    }
    return 1;
}
int main () {
    scanf ("%d", &t);
    while (t--) {
        scanf ("%d%d", &n, &w);
        for (int i = 1; i <= n; i++) {
            scanf ("%d", &a[i]);
        }
        sort (a + 1, a + 1 + n, greater<int>());
        int l = 1, r = n + 1;
        while (l < r){
            int mid = (l + r) >> 1;
            if (calc(mid))
                r = mid;
            else
                l = mid + 1;
        }
        printf ("%d\n", l);
    }
    return 0;
}