PTA |程序设计类实验辅助教学平台 (pintia.cn)
任务非常简单:给定N在高速公路上形成简单循环的出口,您应该告诉任何一对出口之间的最短距离。
输入规范:
每个输入文件包含一个测试用例。对于每种情况,第一行都包含一个整数N(在 [3,105]),后跟N整数距离D1 D2 ⋯ DN哪里D我是两者之间的距离我-th 和(我+1)-st 出口,以及DN介于N-th 和第一个退出。一行中的所有数字都用空格分隔。第二行给出一个正整数M (≤104),与M接下来是行,每个行都包含一对出口号码,前提是出口的编号从 1 到N.保证总往返距离不超过107.
输出规格:
对于每个测试用例,将结果打印在M行,每条线都包含相应给定出口对之间的最短距离。
示例输入:
<span style="color:#404040"><code class="language-in">5 1 2 4 14 9
3
1 3
2 5
4 1
</code></span>
示例输出:
<span style="background-color:var(--bg-base)"><span style="color:#404040"><code class="language-out">3
10
7</code></span></span>
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<string>
using namespace std;
typedef pair<int, int> p;
int main() {
int n;
cin >> n;
int sum = 0;
vector<int> exit(n+1);
vector<int> distance(n+1);
distance[0] = 0;
for (int i = 1; i <= n; i++) {
cin >> exit[i];
sum += exit[i];
distance[i] = sum;
}
int m;
cin >> m;
vector<p> M(m+1);
vector<int> ans(m+1);
for (int i = 1; i <= m; i++) {
cin >> M[i].first >> M[i].second;
if (M[i].first > M[i].second)swap(M[i].first, M[i].second);
}
for (int i = 1; i <= m; i++) {
int a = 0, b = 0;
a = distance[M[i].second-1]- distance[M[i].first-1];
b = sum - a;
ans[i] = min(a, b);
}
for (int i = 1; i <= m; i++)cout << ans[i] << endl;
}