[C++][CSP][GESP][前缀和] 加油站2

思路:

1.利用前缀和数组s保存每个加油站与1号加油站的距离

什么是前缀和?

前缀和数组s[i]是原数组a中前i个数的累加

例如:s[3]=a[1]+a[2]+a[3]

#include <bits/stdc++.h>
using namespace std;
int n,a[100005],q;//n:加油站的数量 a:原数组,代表每个加油站与下个加油站的距离 q:q次查询
long long s[100005];//s:前缀和数组,代表每个加油站与1号加油站的距离
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];//求出前缀和数组
	}
	cin>>q;
	for(int i=1;i<=q;i++){
		long long l,r,a,b;
		cin>>l>>r;
		a=s[r-1]-s[l-1];//利用前缀和数组求出l号加油站到r号加油站的距离
		b=s[n]-a;//由于这是一个环形,所以还有逆时针的情况
		if(a<b)//求出a(顺时针)和b(逆时针)中的最短距离
		    cout << a << endl;
		else
		    cout << b << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值