JAJA_Xin的小心思
现有一个容积为mmm的行李箱和nnn个压缩袋,行李被分装进了nnn个压缩袋,已知第iii个装好的袋子有初始体积aia_iai,压缩后的体积为bib_ibi,求至少要压缩几个袋子才能把行李装进行李箱?其中1≤n≤105,1≤m≤109,1≤ai,bi≤109,bi<ai1≤n≤10^5,1≤m≤10^9,1≤ai,bi≤10^9, bi<ai1≤n≤105,1≤m≤109,1≤ai,bi≤109,bi<ai
贪心法.
先考虑一个袋子也不压缩的情况,占用体积∑ai\sum a_i∑ai;
由一个袋子也不压缩变为只压缩1个袋子,体积减少得越多,总体积越小.由此考虑压缩多个袋子.每次选取压缩得最多的一件行李,直到体积小于mmm为止.
#include <bits/stdc++.h>
#define MAXN 10000005
using namespace std;
int d[MAXN];
int n,m;
long long sum;
bool cmp (int a,int b)
{
return a>b;
}
int main ()
{
while(scanf("%d %d",&n,&m)!=-1)
{
sum=0;
//memset(d,0,sizeof(d));
for (int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
sum+=x;
d[i]=x-y;
}
sort(d,d+n,cmp);
int p=0,cnt=0;
while (sum>m && p<n)//可改成 while (sum>m && cnt<=n),但需要memset().
{
sum-=d[p++];
cnt++;
}
if (sum>m)
printf("-1\n");
else
printf("%d\n",cnt);
}
return 0;
}
探讨了如何使用贪心算法解决行李箱装载问题,通过压缩部分压缩袋以使总体积适应固定大小的行李箱。

被折叠的 条评论
为什么被折叠?



