这是ICPC2024网络赛的第二场的J题
题面:
思路:
只考虑相邻的两个物品1,2,设前面物品的总重量为S。这时交换物品1和2的位置只会对1,2处的压缩体积有影响,不会影响前面和后面物品的答案。
S
1:w1 v1 c1
2:w2 v2 c2
.......
情况1:
物品1在物品2的上面,这种情况下能压缩的体积 ans1=S*c1+(S+w1)*c2。
情况2:
物品2在物品1的上面,这种情况下能压缩的体积 ans2=S*c2+(S+w2)*c1。
假设 ans1>ans2,则有S*c1+(S+w1)*c2>S*c2+(S+w2)*c1。
化简一下式子即可得到w1/c1>w2/c2,因此把wi/ci更大的放在更前面可以获得更大的压缩空间,所以按wi/ci的大小从大到小排序就是最优的排序。
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+7;
struct node{
ll w,v,c;
}a[N];
bool cmp(node A,node B){
return A.w*B.c>A.c*B.w;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].w>>a[i].v>>a[i].c;
}
sort(a+1,a+n+1,cmp);
ll ans=0;
for(int i=1,pre=0;i<=n;i++){
a[i].v=a[i].v-pre*a[i].c;
pre+=a[i].w;
ans+=a[i].v;
}
cout<<ans<<'\n';
return 0;
}