专栏文章
题解:CF1498B Box Fitting
CF1498B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio0dow8
- 此快照首次捕获于
- 2025/12/02 11:18 3 个月前
- 此快照最后确认于
- 2025/12/02 11:18 3 个月前
题目大意
要求找到一个最小高度的二维盒子,使得 个给定的宽度为 的方幂的长条能够在不旋转、不重叠的情况下放入宽度为 的盒子之中。
题目解法
-
只要直到答案可以简单判断出是否满足题目要求,所以采用二分解决。
-
二分范围:因为最多需要 层用来放置长条,所以二分范围是从 到 。
-
如果答案合法根据题目要求尝试更小的值,否则尝试更大值让答案尽可能满足。
给出代码
CPP#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...