您的位置:首页 > 其它

UVA 1149 Bin Packing(贪心)

2017-09-08 16:30 357 查看

题目链接

题意

给出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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva