先翻译一下
题目描述
任务非常简单,给出存在于一条公路上的组成一个圆的 N个点,你应该能给出任意一组端点上的最短距离
输入格式
每个输入文件都包含一个测试实例。
对每个例子来说,第一行包含一个整数N,(大小在3~10^5),紧接着N个整数表示距离D1,D2...DN,Di表示第i和第i+1条边的距离,DN表示第N条边与第一条边的距离。在这行上的所有数据都由一个空格隔开。
第二行给出了一个正整数M(M <= 10^4),下面有M行,每行包含一对出口编号,假设是出口编号从1到N,假设总共的往返距离不超过10^7
输出格式
对于每个测试实例,M行中输出你的结果,每行包含对应给出的那组出口的最短距离
#include <iostream>
using namespace std;
const int n = 100000;
int dist[n];
int main() {
int M, N;
cin >> N;
int i = 0;
// 记录边长
while (i < N) {
cin >> dist[i++];
}
// 记录要查询的端点对数
cin >> M;
int a, b;
// 思路很简单,一个环,被一对端点分成两部分,求这两部分的弧长权重的和,取和小的那部分
int left = 0, right = 0, j;
i = 0;
while (i++ < M) {
cin >> a;
cin >> b;
if (a > b) {
int tmp = a;
a = b;
b = tmp;
}
a--;
b--;
j = a;
while (j < b) {
right += dist[j];
j++;
}
while (j < N) {
left += dist[j];
j++;
}
j = 0;
while (j < a) {
left += dist[j];
j++;
}
cout << (right>left ? left : right) << endl;
left = right = 0;
}
return 0;
}
小坑:a,b的取值
有可能a的值比b的值大,所以要调换一下顺序,不然导致逆时针遍历(数组遍历写的是顺时针遍历)无法进行