题意:
给定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; } }