贪心——牛牛的旅行

39 篇文章 1 订阅

贪心——牛牛的旅行

题目描述

有n个人在x轴上,每个人的坐标是一个整数,牛牛是一个旅行商人,他在轴上穿梭并与这n个人交易,交易的商品只有一种,每一个人都有对这种商品的需求或者供应,如果delta[i] 是正数,表示这个人要供应delta[i]的数量,如果是负数,表示这个人需要−delta[i]的购买量,保证delta的和非负,一开始牛牛在0位置,手里没有任何商品,每一秒他可以往左或者往右走1个单位的距离,如果他和一个人在同一个位置,就可以与之交易,交易是瞬间发生的,每笔交易的数量是由牛牛决定的,当然他不能卖出超出自己手里含有的商品数量,行走过程中牛牛手里可以拿着任意多的商品,到了一个人的位置,也可以选择不与之交易,最终牛牛需要满足以下两点:

1:牛牛必须满足所有人的需求。

2:旅行必须要在最后一个人的位置结束。

求最少需要花费多少时间。

输入描述

第一行输入一个整数n (1 ≤ n ≤ 300)。

第二行输入n个元素pos[i]( 1 ≤ pos[i] ≤ 105), 表示每个人的位置。

第三行输入n个元素delta[i](-105 ≤ delta[i] ≤ 105)表示每个人的需求。

保证pos单调递增,delta的和非负。

输出描述

输出一个整数表示最少需要花费的时间。

示例1

输入

5
3 14 15 92 101
-3 2 3 -3 1

输出

143

说明

总共5个人,0号人在3位置,需要3的购买量. 1号人在14位置有2的供应量. 2号人在15位置有3的供应量. 3号人在92位置有3的购买量。4号人在101位置有1的供应量,最优路线如下
第一步走到15位置. 买下2号人所有的供应量
第二步走到14位置,买下1号人所有的供应量,当前alice一共有5个单位的量。
第三步走到3位置,卖出3个单位。还剩2个单位
第四步走到101,买下4号人的供应量,当前手里一共有3个单位
第五步走到92,卖给3号人3个单位
最后走到101结束旅程
一共花的时间是 15+1+11+98+9+9 = 143。

示例2

输入

8
1 2 4 8 16 32 64 128
-1 -1 -1 -1 1 1 1 1

输出

382

备注

子任务一30分: n ≤ 20

子任务二30分:n ≤ 100

子任务三40分:n ≤ 300

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,l,now;
int pos[301];
int delta[301];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>pos[i];
	}
	for(int i=1;i<=n;i++){
		cin>>delta[i];
	}
	m=0;
	l=0;
	now=0;
	for(int i=1;i<=n;i++){
		if(now<0&&now+delta[i]>=0){
			m+=(pos[i]-l)*2;
		}
		if(now>=0&&now+delta[i]<0){
			l=pos[i];
		}
		m+=pos[i]-pos[i-1];
		now+=delta[i];
	}
	cout<<m<<endl;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值