大致思路:
开一个优先队列,开始将w入队,因为方块高度全为1,故只看其长度即可,将其从大到小排队,优先队列里存每一行的剩余容量,如果a[i]大于与队顶(放不下),则开辟新一行,及将(w-a[i])入队,否则将(q.top()-a[i])入队,最后队列长度即为答案。
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=100010;
typedef long long ll;
bool cmp(ll a,ll b)
{
return a>b;
}
int a[N];
int main()
{
int t;cin>>t;
while(t--)
{
int n,w;
cin>>n>>w;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
priority_queue<ll>q;
q.push(w);
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
int t=q.