UVA 1149 Bin Packing (贪心+二分)

题意:

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


猜你喜欢

转载自blog.csdn.net/insist_77/article/details/80397661
今日推荐