请哪位大佬帮我看看代码有什么问题,本来可以用堆做的,但是跟同学打了个赌,用数组做
  • 板块学术版
  • 楼主♂♂♂
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/5/15 15:11
  • 上次更新2023/11/4 23:14:20
查看原帖
请哪位大佬帮我看看代码有什么问题,本来可以用堆做的,但是跟同学打了个赌,用数组做
435303
♂♂♂楼主2021/5/15 15:11
小明的手机上有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;
}
2021/5/15 15:11
加载中...