上海计算机学会2020年4月月赛C++丙组T3调配问题

题目描述

各城市之间,需要进行物资的调配。给定一个整数 n,表示城市数量。再给定一列整数 a1​,a2​,⋯,an​,表示每个城市生产或者消费物资的数量——

  • 正数表示对应城市是生产物资的,其绝对值代表产量;
  • 负数表示对应城市是消费物资的,其绝对值代表消费量;

这些城市之间的道路网络呈一条直线,只有编号相邻的城市有道路相连。从某个城市搬运一个单位的物资到相邻城市将产生一个单位的工作量。请设计一个方案,使得每个城市需要的物资都能达成,且运输的总工作量达到最小。

输入数据保证生产总量和消费总量是相等的,即 a1​+a2​+⋯+an​=0。

输入格式
  • 第一行:单个整数表示 n。
  • 第二行:n 个整数表示a1​,a2​,⋯,an​。
输出格式
  • 单个整数:表示最优运输方案产生的最少工作总量。
数据范围
  • 对于 30% 的数据,1≤n≤10;
  • 对于 60% 的数据,1≤n≤100;
  • 对于 100% 的数据1≤n≤100000,100000≤ai​≤100000;
样例数据

输入:

4
-10 10 20 -20

输出:

30

输入:

5
100 -10 -20 -30 -40

输出:

300

说明:

10+2*20+3*30+4*40=10+40+90+160

题解

本题关键点:

1.  数据范围用long long
2. 从第一个元素开始往后累加,直到都变成0为止

代码如下。

#include <iostream>
using namespace std;
int main()
{
	int n;
	long long sum=0;
	long long a[100001];
	cin>>n;
	for (int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
	}
	for (int i=1;i<n;i++){
        sum+=abs(a[i]);
        a[i+1]+=a[i];
	}
	cout<<sum<<endl;
	return 0;
}

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈工程师Linda

感恩您的鼓励,我会继续创作作品

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

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

打赏作者

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

抵扣说明:

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

余额充值