题目描述
这项任务非常简单:给定一条高速公路上的N个出口,形成一个简单的循环,你应该说出任何一对出口之间的最短距离。
输入格式
每个输入文件包含一个测试用例。对于每种情况,第一行包含一个整数N(in[3, 1 0 5 {10^5} 105],后跟N个整数距离D1 D2 … DN,其中Di 是第i个出口和(i+1)个出口之间的距离,DN是第N个出口和第一个出口之间的距离。一行中的所有数字都用空格隔开。第二行给出一个正整数M(<= 1 0 4 {10^4} 104),后跟M行,每行包含一对出口编号,前提是出口编号从1到N。保证总往返距离不超过 1 0 7 {10^7} 107。
输出格式
对于每个测试用例,以M行打印结果,每行包含相应给定出口对之间的最短距离。
输入用例
5 1 2 4 14 9
3
1 3
2 5
4 1
输出结果
3
10
7
代码
/*永远只有两种距离:
(1)从1-->2-->...-->n的距离dis
(2)sum-dis
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX = 100001;
int dis[MAX], A[MAX], dis_min[MAX];
//dis:1顺时针到i的距离, A[i]:i到i+1的距离, dis_min:每次输出的最小距离
int main()
{
int sum = 0, query, n, left, right;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &A[i]);
sum += A[i];
dis[i] = sum;
}
scanf("%d", &query);
for(int i = 0; i < query; i++){
scanf("%d%d", &left, &right);
if(left > right) swap(left, right);
int temp = dis[right-1] - dis[left-1]; //在一段距离中,right是目标, left是起始
dis_min[i] = min(temp, sum - temp);
}
for(int i = 0; i < query; i++){
printf("%d\n", dis_min[i]);
}
}