题意:
给定N(N<1e5)个物品的重量Li,背包的容量M,同时要求每个背包最多装两个物品,求至少需要多少个背包才能装下所有的物品。
思路:
首先将所有的物品排序,然后从头往后取,每次取第一个,然后找出放了第一个之后背包还能放多少,这里用的是二分
upper_bound(返回一个序列中第一个大于要查找值的位置)
代码:
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 1e5 + 5 , inf = 0x3f3f3f3f ;
vector<int>bins;
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int kase,n,m,Max,k=0;
scanf("%d",&kase);
while(kase--){
bins.clear();
scanf("%d%d",&n,&Max);
for(int i = 0 ; i <n ; i ++ ){
scanf("%d",&m);
bins.push_back(m);
}
sort(bins.begin(),bins.end());
int cnt = 0;
while(!bins.empty()){
int now = Max - bins[0];
int p = upper_bound(bins.begin()+1,bins.end(),now) - bins.begin() - 1;
if(p==0) bins.erase(bins.begin());
else{
bins.erase(bins.begin()+p);
bins.erase(bins.begin());
}
cnt++;
}
if(k++) cout<<endl;
cout<<cnt<<endl;
}
}