小明的手机上有n首歌,其中第i首歌的大小为ai字节。现在他想把这n首歌复制到SD卡中,但SD卡的容量有限,可能无法容纳这n首未经压缩的歌曲。小明现在可以选择压缩一些歌曲,其中第i首歌曲压缩后的大小会从ai 降为bi 。由于压缩歌曲会损坏音质,所以小明想尽量减少压缩歌曲的数目。
现在已知SD卡的容量为m字节,小明想知道他至少要压缩多少首歌曲才能复制所有歌曲到SD卡中(即歌曲大小总和<=m) 如果无法复制所有歌曲到SD卡中(即压缩了所有歌曲后大小总和依旧>m),则输出-1。
输入格式
第1行输入两个整数n,m(1 \leq n \leq 1000001≤n≤100000 ,1 \leq m \leq 10^91≤m≤10
9
)--n表示小明手机的歌曲数,m表示SD卡的容量。
接下来n行中每行都包含两个整数:ai 和bi ,ai表示第i首歌压缩前的大小,bi表示第i首歌压缩后的大小。
输出格式
如果无法将所有歌曲复制到SD卡中,输出-1;否则输出最小压缩歌曲数。
输入输出样例
输入 #1复制
4 21
10 8
7 4
3 1
5 4
输出 #1复制
2
输入 #2复制
4 16
10 8
7 4
3 1
5 4
输出 #2复制
-1
说明/提示
30%的数据 1<=n<=100; 60%的数据 1<=n<=1000; 100%的数据1<=n<=100000 ,1<=m<=10^910
9
;
对于所有数据,1<=ai ,bi <=10^910
9
,且ai>bi。
#include<bits/stdc++.h>
#define ll long long//开局Long long 成为习惯
using namespace std;
ll a[10001];
ll b[10001];
ll y[10001];//定义三个数组,也不知道什么时候会用到
int main(){
ll c=0,d,sum,n,m,i=1;
cin>>n>>m;//n为要输入的次数,m为SD卡的最大内存
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];//输入他的两个数组,因为适配新手,强行将堆干爆
}
for(int i=1;i<=n;i++){
y[i]=a[i]-b[i];//从第一次开始他的压缩能够减少的空间储量,一开始其实是想要打下面那个的
//c=c+a[i]-b[i]
//但是数组比较好打也熟悉一点,原本是想要用这个来搞的,但是嫌麻烦,有时间再说
}
for(int i=1;i<=n;i++){
c=a[i]+c;//这里就比较简单了,不想打数组,于是就用概念的话就是把输入不是有两行吗
//4 21
//10 8
//7 4
//3 1
//5 4
//设定的就是将10+7+3+5=25这就是这里面c的值
}
sum=c-m;
if(sum<=0){
cout<<0;//这里进行一个小判定,就是说sum就是等于说是没有压缩的总值减掉压缩了SD卡的值,如果说没有压缩就比他大的话就可以直接输出0了 ,因为无需压缩。
}else{//否则就是需要压缩落;这里比较麻烦,一个是输出0,要么就是输出不完,输出-1或者就是说输出这个数值罗
for(int i=1;;i++){
c=c-y[i];
sum=c-m;//这里指的是用他的值跟他做比较,就是用每一次的总空间减掉压缩空间,可以说每一次都要进行一次判断
if(sum<=0){
cout<<i;//如果哪一次就是说sum终于小于0了就代表说他终于是可以装下了,接下来还要做一个判定,就是说如果装不下的话就要输出-1。
}else{
c=c;
}
if(i==n){
if(sum<=0){
cout<<i;
}else{
cout<<-1;
}
break;
}else{
break;
}
}
}
return 0;
}