题目来源
Shortest Distance - PTA
Shortest Distance - 牛客
Description
The task is really simple: given N N N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.
Input Specification:
Each input file contains one test case. For each case, the first line contains an integer N N N ( in [ 3 , 10 5 ] [3,10^5] [3,105] ), followed by N integer distances D 1 , D 2 ⋯ D N D_1,D_2\cdots D_N D1,D2⋯DN, where D i D_i Di is the distance between the i i i-th and the ( i + 1 ) (i+1) (i+1)-st exits, and D N D_N DN is between the N N N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M ( ≤ 10 4 ) M(≤10^4) M(≤104), with M M M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 1 1 to N N N. It is guaranteed that the total round trip distance is no more than 10 7 10^7 107
.
Output Specification:
For each test case, print your results in M M M lines, each contains the shortest distance between the corresponding given pair of exits.
Sample Input:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7
题目大意
一个有 N N N 个结点的环,给定每个相邻结点之间的距离、
输入若干组 a , b a,b a,b ,问结点 a , b a,b a,b 的最短距离
思路简介
前缀和
用前缀和数组 sum 维护距离, a → b a\to b a→b 的距离就是 s u m [ b ] − s u m [ a ] sum[b]-sum[a] sum[b]−sum[a]
用 len 表示环的总长度,则 b → a b\to a b→a 的距离就是 l e n − ( s u m [ b ] − s n u m [ a ) len-(sum[b]-snum[a) len−(sum[b]−snum[a)
取最小值即可
遇到的问题
- 无,一遍过
代码
cpp
/**
* Shortest Distance
* https://pintia.cn/problem-sets/994805342720868352/exam/problems/type/7?problemSetProblemId=994805435700199424
* https://www.nowcoder.com/pat/5/problem/4085
* 前缀和
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],n;
void init(){
d[1]=0;
cin>>n;
for(int i=1;i<=n;++i){
int tmp;cin>>tmp;
d[i+1]=d[i]+tmp;
}
}
void solve(){
int i,j;
cin>>i>>j;
int len=d[n+1];
int res=abs(d[j]-d[i]);
cout<<min(res,len-res)<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//fstream in("in.txt",ios::in);cin.rdbuf(in.rdbuf());
int T=1;
init();
cin>>T;
while(T--){
solve();
}
return 0;
}