题目
题解思路
首先想到的是从大到小或者从小到大 进行贪心,然后用W不断减去加进去的。当减不了使就增加宽度。这样就导致了有些位置明明能放小的没放 例如样例 8 8 8 2 2 2 这样算的花答案是4 但是答案是3 这样我们就需要用堆来维护这个存储的过程了,定义一个从大到小出队的优先队列,每次将最大的空间拿出来放置这个物体,这样等到小物体出现时空间就不会被浪费了
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e6+5;
int t,n,w;
int a[maxm];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>w;
for(int i=0 ;i< n ;i++)
cin>>a[i];
priority_queue<int,vector<int>,less<int> >q;
sort(a,a+n);
q.push(w);
for ( int i =n-1 ;i>=0 ;i--)
{
if(q.top()>=a[i])
{
int x=q.top();
q.pop();
q.push(x-a[i]);
}else
{
q.push(w-a[i]);
}
}
cout<<q.size()<<"\n";
}
return 0;
}