1046 Shortest Distance
题目在这里
主要要求的是圈中两点的最短距离,在这个圆中可以顺时针走,也可以逆时针走。题目要求的是最短路径。其中:顺时针走的距离+逆时针走的距离 = 走一圈的距离。
tips:
- 使用dis[i]记录顺时针从1到达i号节点的下一个节点的距离,sum为一圈的距离,要求的距离也就是dis[right-1]-dis[left-1]
- 一定不能把dis[i]记录为顺时针从1到i的距离,这样的话N到1的就没办法保存了
- 查询两点left可能会大于right,一定要记得swap交换一下!!!!
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxN=100005;
int dis[maxN],A[maxN];
int main(){
int n,m;
int right,left;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>A[i];
sum+=A[i];
dis[i]=sum;
// cout<<dis[i]<<endl;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>left>>right;
if(left>right) swap(left,right);
int temp=dis[right-1]-dis[left-1];
cout<<min(temp,sum-temp)<<endl;
}
return 0;
}
按照例子:
INPUT:
5 1 2 4 14 9
3
1 3
2 5
4 1
OUTPUT::
3
10
7
存储的dis数组为:1 3 7 21 30(方便理解)