【PAT甲级】1046 Shortest Distance (20 分)
题目要求
一个环形高速公路上有 N 个出口,共有 M 次询问,每次询问你需要回答其中两个出口之间的最短距离是多少。
输入格式
第一行首先包含一个整数 N,接下来包含 N 个整数 D1,D2,…,DN,其中 Di 是第 i 个出口与第 i+1 个出口之间的距离,DN 是第 N 个出口与第 1 个出口之间的距离。
第二行包含一个整数 M,表示询问次数。
接下来 M 行,每行包含两个整数,表示询问两个出口之间的最短距离。
输出格式
共 M 行,每行输出一个查询的答案。
思路
- 以1、2、4、14、9为例,由上图可知,从2号出口到5号出口可以走2-3-4-5,也可以走2-1-5,因此取这两种走法的最小值计科
- 首先读入数组,求出前缀和,对前缀和不了解的可以看这篇博文https://blog.csdn.net/weixin_43864567/article/details/116211912?spm=1001.2014.3001.5501
- 求出前缀和后,答案就取两者之间的最小值
代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5+10;
int s[N];
int main()
{
int n,m;cin >> n;
for(int i=1;i<=n;i++)
{
scanf("%d", &s[i]);
s[i] += s[i - 1];
}
cin >> m;
while (m--)
{
int l, r;
cin >> l >> r;
if (l > r) swap(l, r);
int ans = min(s[r-1]-s[l-1],s[n]-(s[r - 1] - s[l - 1]));
cout << ans<<endl;
}
return 0;
}