我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805435700199424
题目描述:
题目翻译:
1046 最短距离
任务很简单:如果N出口在高速公路上形成一个环,你需要说出任何一对出口之间的最短距离。
输入格式:
每个输入文件包含一个测试用例,对每个测试用例,第一行包含一个正整数N(在[3, 10 ^ 5])范围内,紧跟着N个距离D1 D2 ... DN,其中Di表示第i个出口和第i + 1个出口的距离,DN表示第N个出口和第1个出口的距离。一行中的所有数字由一个空格分隔。第二行给出一个正整数M(<= 10 ^ 4),紧跟着M行,每行给出一对数字,代表出口编号,出口编号为1 ~ N。题目保证环形一圈的长度不超过10 ^ 7。
输出格式:
对每个测试用例,在M行中打印你的结果,每行输出给定出口编号间的最短距离。
输入样例:
5 1 2 4 14 9
3
1 3
2 5
4 1
输出样例:
3
10
7
知识点:数组
思路:从小编号走到大编号,或从大编号绕过数组末端折回数组首端,取较小者
注意出口的编号为1 ~ N。时间复杂度是O(N)。空间复杂度是O(1)。
C++代码:
#include<iostream>
using namespace std;
int main(){
int N;
scanf("%d", &N);
int distances[N];
for(int i = 0; i < N; i++){
scanf("%d", &distances[i]);
}
int M;
scanf("%d", &M);
int num1, num2, distance1, distance2;
for(int i = 0; i < M; i++){
scanf("%d %d", &num1, &num2);
if(num1 > num2){
int temp = num1;
num1 = num2;
num2 = temp;
}
distance1 = 0;
for(int j = num1 - 1; j < num2 - 1; j++){
distance1 += distances[j];
}
distance2 = 0;
for(int j = num2 - 1; j < N; j++){
distance2 += distances[j];
}
for(int j = 0; j < num1 - 1; j++){
distance2 += distances[j];
}
printf("%d\n", min(distance1, distance2));
}
return 0;
}
C++解题报告: