JAJA_Xin的小心思
现有一个容积为
m
m
m的行李箱和
n
n
n个压缩袋,行李被分装进了
n
n
n个压缩袋,已知第
i
i
i个装好的袋子有初始体积
a
i
a_i
ai,压缩后的体积为
b
i
b_i
bi,求至少要压缩几个袋子才能把行李装进行李箱?其中
1
≤
n
≤
1
0
5
,
1
≤
m
≤
1
0
9
,
1
≤
a
i
,
b
i
≤
1
0
9
,
b
i
<
a
i
1≤n≤10^5,1≤m≤10^9,1≤ai,bi≤10^9, bi<ai
1≤n≤105,1≤m≤109,1≤ai,bi≤109,bi<ai
贪心法.
先考虑一个袋子也不压缩的情况,占用体积
∑
a
i
\sum a_i
∑ai;
由一个袋子也不压缩变为只压缩1个袋子,体积减少得越多,总体积越小.由此考虑压缩多个袋子.每次选取压缩得最多的一件行李,直到体积小于
m
m
m为止.
#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;
}