题目大意:有n个长为2的幂的长方形,现在要把他们装进一个长为w的容器内,不能旋转,至少要装几层
思路:因为笑得长方形放置的选择比大的要多,所以我们可以从大到小考虑,在储存长方形的宽时,可以只记录2的i次幂的出现次数,然后从最高次幂开始向下遍历,当前的长方形装不下一层了,就加一层
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005;
ll a[N];
int b[20];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
ll w;
int ma = 0;
scanf("%d%lld", &n, &w);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
int x = log2(a[i]);//只记录宽度是2的几次幂
ma = max(ma, x);//找到最大次幂,下面从这里开始遍历
b[x]++;
}
int ans = 0;
while (1)
{
int tot = w;
for (int i = ma; i >= 0; i--)
{
while (b[i]&& tot >= (1 << i))
{
b[i]--;
tot -= (1 << i);//tot是空着的长度,空着的不够装下一个了,就开始新的一层
}
}
if (tot == w)//空的长度等于总长,说明所有长方形都装进去了
break;
ans++;
}
printf("%d\n", ans);
}
return 0;
}