题目链接:http://poj.org/problem?id=2782
题目大意: 给出n袋长度不一定相同的垃圾,把它们全部装在长度不超过L的垃圾桶里;
每个垃圾桶至多有两袋垃圾,并且垃圾的长度相加小于L;
求最少用多少个垃圾桶可以装入全部垃圾;
解题思路: 每个垃圾桶最多只能有两袋垃圾,也就是说可以装是一袋或者两袋;
先排序,然后分别从最小、最大两个极端开始枚举:
如果相加小于或等于L,那么可以装下两袋垃圾,并且标记;
最后把只能装入一个垃圾桶的垃圾袋统计出来,和上面的相加!
代码:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAX 100001
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int n,l,a[MAX];
int main()
{
int i,j,k,temp;
scanf("%d%d",&n,&l);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n); //把桶的长度从小到大排列
temp=n-1;
for(i=0,k=0;i<n-1;i++)
{
for(j=temp;j>i;j--) //j=n-1 会TLE
{
if(a[i]!=-1&&a[j]!=-1&&a[i]+a[j]<=l) //如果这两包垃圾没塞进垃圾桶,并且两个的长度相加小于l
{
k++;
a[i]=-1; //使用之后标记
a[j]=-1; //使用之后标记
temp=j; //***这个很重要,记录最后一次塞过的那个桶,否则会超时
break;
}
}
}
for(i=0;i<n;i++)
{
if(a[i]!=-1)
k++;
}
printf("%d\n",k);
return 0;
}
注:原创文章,转载请注明出处.