http://codeforces.com/contest/1015/problem/C
题意:
输入n和m,m为存储空间,接下来n行a和b, a大于b
每一行的a可以压缩为b的大小,求最少只需要压缩几个,使得m可以存下所有数据
如果全部压缩都不满足,就输出-1
思路:存下a和b的差值
算出最大的和和最小的和,如果最小和大于m,就输出-1,再用sort根据差值从大到小排序
让最大和依次根据差值从大到小减,直到最大和小于等于m即可,输出减去的个数即为压缩的次数
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=1e5+10;
ll a[maxn],b[maxn],c[maxn];
bool cmp(ll a,ll b) {
return a>b;
}
int main()
{
ll n,m;
while(scanf("%lld%lld",&n,&m)!=EOF) {
ll sum1=0,sum2=0,sum3;
for(int i=1;i<=n;i++) {
scanf("%lld%lld",&a[i],&b[i]);
sum1+=a[i];
sum2+=b[i];
c[i]=a[i]-b[i];
}
sort(c+1,c+n+1,cmp);
int i=1;
int ans=0;
if(sum2>m) printf("-1\n");
else {
ll t=sum1-m;
while(t>0) {
t-=c[i++];
ans++;
}
printf("%d\n",ans);
}
}
return 0;
}