uva 1149 Bin Packing 装箱 (二分+贪心)

来源:互联网 发布:软件总体方案设计评审 编辑:程序博客网 时间:2024/05/29 02:34

这题应该很容易就想到贪心,然后通过观察数据量就知道了如果用暴力会超时,所以这里用二分,博主懒,用了STL的upper_bound,(输出时格式注意下,博主第一次WA)不多说,上代码,不懂的看注释吧





////  main.cpp//  B - 装箱////  Created by wenhan on 2017/8/14.//  Copyright © 2017年 wenhan. All rights reserved.//#include<iostream>#include<cstdio>#include<vector>#include<algorithm>int a[100000+5];using namespace std;int main() {    vector<int> me;    vector<int>::iterator it;    int t;    cin>>t;    while(t--)    {        int n,m;        cin>>n>>m;        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);//现将数据读进来存a中        sort(a+1, a+n+1);//a排序,之后从大到小贪心        int s=0;//计数器        for(int i=n;i>=1;i--)        {            it=upper_bound(me.begin(), me.end(), m-a[i]);//寻找大于m-a[i]的位置,也就是说物体越小找到的位置越后,切记不可用lower_bound,原因自己想一下吧            if(it!=me.begin())//存在比m-a[i]大的            {                me.erase(it-1);//从vector里删去找到位置的前一项,因为之前都放的下            }            else//找不到则将数据插入头部,计数器+1            {                me.insert(it, a[i]);                s++;            }        }        printf("%d\n",s);        if(t!=0)//注意格式            printf("\n");        me.clear();//一定要及时清理    }    // insert code here...    //std::cout << "Hello, World!\n";    return 0;}