题目来源:码蹄集
https://matiji.net/exam/brushquestion/114/3181/1DC60EA6DF83A333301CFFE1407FBA59
时间限制:1000ms
内存限制:65535kb
题目描述:在一条马路上有着n个商铺,有些商铺出售物品,有些收购物品,这些物品的价值是相同的所有,每一种物品都被大家接受并且可以用来交易。
我们把这条马路看作一个x轴,W从这条马路的起点出发(即原点),每个商铺的坐标是确定的,她在前进过程中会经过所有的商铺,并且在第n个商铺处停下。
我们已知这些商铺出售的货物之和是大于等于收购的货物之和的,即所有的商铺的需求都可以被满足。W与他们交易不需要时间,而每在x轴上行走一步就需要1单位时间。
W在初始时手上没有货物,她不能卖给某个商铺超过她手上货物总量的货物,且是否买卖货物由她自己决定,但她必须满足所有商铺的需求,她想知道她最少需要花费多少时间
输入格式:第一行输入一个整数n
第二行输入n个元素pi 表示每个商铺的位置
第三行输入n个元素di表示每个商铺的需求
保证pi单调递增,di的和非负
输出格式:输出一个整数表示最少需要花费的时间
输入样例:
5
3 14 15 92 101
-3 2 3 -3 1
输出样例:143
备注:
(1 ≤ n ≤ 300)
( 1 ≤ pi ≤ 10^5)
(-10^5 ≤ di ≤ 10^5)
如上所述
参考程序:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define N 10000
struct op{
int x, v ;
}s[N] ;
int main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> s[i].x ;
}
for (int i = 1; i <= n; i++){
cin >> s[i].v;
}
int x = 0, qian = 0, rich = 0 ,ans = 0;
for (int i = 1; i <= n; i++){
if (s[i].v < 0) {
qian = qian + s[i].v ;
if (qian < 0 && x == 0) x = s[i].x ;
}
else {
rich = rich + s[i].v ;
}
if (rich >= -qian && qian != 0) {
ans = ans + (s[i].x - x) * 2 ;
//cout << ans <<" " ;
x = 0;
rich = rich + qian ;
qian = 0;
}
}
cout << ans + s[n].x;
return 0;
}