题意:
给一堆高度为1的小块,长度为2的次幂,给一个长度为W(W肯定大于小块的最大长度)的框,要求把所有小块放进框内,求出最小高度,保证小块不旋转也不重叠;
思路:
用优先队列(默认是大根堆),刚开始push一个W进去,然后遍历每一个小木块的长度,如果小木块放不进去,就开辟新的一行;
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <stack>
#define mes memset
#define mec memcpy
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N = 1000010;
const int null = 0x3f3f3f3f;
const ll mod = 1000000007;
int T;
ll n,W;
int w[N];
bool st[N];
ll gcd(ll a,ll b) {
while(b^=a^=b^=a%=b);
return a;
}
bool cmp(int x,int y){
return x>y;
}
int main()
{
cin>>T;
while(T--){
cin>>n>>W;
for(int i=1;i<=n;i++) cin>>w[i];
sort(w+1,w+n+1,cmp);
priority_queue<int>q;
q.push(W);
for(int i=1;i<=n;i++){
int t=q.top();
// cout<<t<<endl;
if(w[i]>t){
q.push(W-w[i]);
}else{
q.pop();
q.push(t-w[i]);
}
}
cout<<q.size()<<endl;
}
return 0;
}