Stacking of Goods题解

这是ICPC2024网络赛的第二场的J题

codeforces题目链接

题面:439e4696676540deac4a365d9e2dc185.png

思路:

只考虑相邻的两个物品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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方延绪z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值