0%

CF1015C Songs Compression 题解

题目传送门

思路

贪心。

考虑到,如果把 aia_i 换成 bib_i,总重量会减少 aibia_i-b_i

每次操作找到最大的 aibia_i-b_i,把 aia_i 替换成 bib_i

所以,我们可以将这些物品按 aibia_i-b_i 递减的顺序来排序。

排序后,按照从 11nn 的顺序替换,直到总重量不超过 mm 为止。

程序末尾还要判断一下,当 aia_i 全部替换成 bib_i 时,是否能装下。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{int a,b;} a[100010];
bool cmp(node a,node b)
{
return a.a-a.b>b.a-b.b;
}
int n,m;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
int sum=0;//sum记录总质量
for(int i=1;i<=n;i++)
cin>>a[i].a>>a[i].b,sum+=a[i].a;

if(sum<=m)//特判:此时总重量小于等于m,不需要替换,答案为0
{
cout<<0;return 0;
}

sort(a+1,a+1+n,cmp);//按照b[i]-a[i]递减的顺序排序
for(int i=1;i<=n;i++)
{
sum-=a[i].a-a[i].b;//将a[i]替换成b[i],总质量减少a[i]-b[i]
if(sum<=m)//如果总重量小于等于m,说明背包已经能装下。此时替换了i次,直接输出i即可
{
cout<<i;return 0;
}
}
cout<<"-1";//所有的数字都换了,仍无法装下,输出-1
return 0;
}