#include <iostream> using namespace std; struct music{ long long b,c,d; }a[100005]; int main(){ long long n,m,sum=0,sum1=0; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i].b>>a[i].c; a[i].d=a[i].b-a[i].c; sum+=a[i].b; sum1+=a[i].c; } if(sum1>m){ cout<<-1; return 0; } if(sum1==m){ cout<<0; return 0; } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ if(a[i].d<a[j].d){ swap(a[i],a[j]); } } } long long i=0,cha=sum-m; while(cha>0&&i<n){ cha-=a[++i].d; } cout<<i; return 0; } 为什么不对?
时间: 2024-01-25 17:02:01 浏览: 63
这段代码的主要问题在于排序的方式不正确。题目要求在可用空间内尽可能多地存储被压缩后的音乐文件,因此应该按照文件压缩后的大小进行从小到大的排序,而不是按照d值进行从大到小的排序。
具体来说,应该将第5步的代码修改为:
```c++
sort(a+1, a+n+1, [](music x, music y){return x.c < y.c;}); // 按照c值从小到大排序
```
另外,第6步的代码也存在问题,因为在排序后,d值的大小已经不再具有可比性,应该改为累加被压缩后的文件大小c。具体来说,应该将第6步的代码修改为:
```c++
long long i = 0, cha = sum - m;
while (cha > 0 && i < n) {
cha -= a[++i].c; // 累加被压缩后的文件大小
}
```
修改后的完整代码如下:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
struct music {
long long b, c, d;
} a[100005];
int main() {
long long n, m, sum = 0, sum1 = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i].b >> a[i].c;
a[i].d = a[i].b - a[i].c;
sum += a[i].b;
sum1 += a[i].c;
}
if (sum1 > m) {
cout << -1;
return 0;
}
if (sum1 == m) {
cout << 0;
return 0;
}
sort(a+1, a+n+1, [](music x, music y){return x.c < y.c;}); // 按照c值从小到大排序
long long i = 0, cha = sum - m;
while (cha > 0 && i < n) {
cha -= a[++i].c; // 累加被压缩后的文件大小
}
cout << i;
return 0;
}
```
阅读全文