UVA11054Gergovia的酒交易

本文探讨了一个问题,即如何在给定村庄购买或出售酒的条件下,通过计算相邻村庄间运输酒的费用,找到最小化的总花费方案。通过遍历村庄序列并基于当前累计值调整费用,实现最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
      有n个村庄,每个村庄要么买酒要么买酒,负数是买酒,整数是买酒,题目保证所有的数字想加和为0,保证有解,然后每一个村庄往相邻的村庄运k坛酒的花费是k,问满足所有的村庄的最小花费是多少?


思路:
      比较容易想,直接扫一遍就行了,我们从左到右,开一个变量记录当前这个点前面的和,假如是整数,说明前面整体还是卖酒的,假如是负数说明是买酒的,不论是正是负,当前这一步必须也最少要花sba(sum)那么多钱,就这样更新到最后就行了,为什么这样会是对的,很容易理解,sum+=num[i]如果是正+负就是说前面的要买到当前的位置,当然是能卖就卖了,难道还继续带着往后走?如果是正+正,说明前面有剩余,现在这家也是要卖酒,那么没办法,这能一起往右买了,同理还有两种情况,就不解释了,具体细节看代码,还有就是记得longlong,一开始大意了WA了一次。
      
      


#include<stdio.h>


long long abss(long long x)
{
    return x > 0 ? x : -x;
}


int main ()
{
    long long i ,n ,Ans ,num ,sum;
    while(~scanf("%lld" ,&n) && n)
    {
       Ans = sum = 0;
       for(i = 1 ;i <= n ;i ++)
       {
          scanf("%lld" ,&num);
          sum += num;
          Ans += abss(sum);
          
       }
       printf("%lld\n" ,Ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值