UVA 1149 Bin Packing(贪心)

来源:互联网 发布:月干支推算法 编辑:程序博客网 时间:2024/06/05 20:15

题目链接

题意

给出n个长度l1 l2 … ln,一个m。
每一个容器长度为m,可以放一个或者两个元素(两者长度之和<=m),询问为了装下这n个元素需要多少个容器(最少)

解决

思路是排序后从小到大开始选,那一个大的之后看能不能再拿一个最小的,如果能拿最小的就等价于这两个能放在同一个容器中,如果不能拿就说明最大的这个只能单独占据一个容器
1. 从小到大排序
2. 从大的开始选,每次让ans+1,能选小的就选一个小的

#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;int main(){    int cases,n,m,num[maxn];    scanf("%d",&cases);    while(cases--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++) scanf("%d",&num[i]);        sort(num,num+n);        int left=0,right=n-1;        int ans=0;        while(left<=right)        {            if(num[left]+num[right]<=m){                left++;                right--;                ans++;                continue;            }            else{                right--;                ans++;            }        }        printf("%d\n",ans);        if(cases) cout<<endl;    }}