1046 Shortest Distance (20 分)
The task is really simple: given 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 (in [3,105]), followed by N integer distances D1 D2 ⋯ DN, where Di is the distance between the i-th and the (i+1)-st exits, and DN is between the 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 (≤104), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 107.
Output Specification:
For each test case, print your results in 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
一开始思考的思路比较简单,无非就是用数组a保存相邻节点间的距离,然后对于m组x,y的结点的距离查询,先进行x>y情况下的交换,使x<y,之后累加x与y之间的结点距离即得到顺时针下的x-->y的距离d1,则sum-d1即为逆时针下的y-->x的距离d2,之后输出更小的一个。代码如下:
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n]; //a[i]表示i+1-->i+2的距离
int sum=0; //组成的圆的距离和
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int m;
scanf("%d",&m);
int x,y;
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
if(x==y)
printf("0");
else{
if(x>y){
int temp=x;x=y;y=temp;
}
int d1=0;
for(int i=x-1;i<y-1;i++)
d1+=a[i];
if(d1<sum-d1)
printf("%d",d1);
else
printf("%d",sum-d1);
}
if(i!=m-1)
printf("\n");
}
}
但结果是运行超时,问题在于每一组x,y都要进行x与y之间所有节点间距离的累加,因此不再使用数组a保存相邻两节点的距离,而是使用dis[]保存结点1至各节点的顺时针距离(dis[i]表示1-->i+1结点的距离),这样计算d1=dis[y-1]-dis[x-1],时间复杂度为O(1),不会出现超时的情况。代码如下:
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int dis[n+1]; //dis[i]表示1-->i+1结点的距离
dis[0]=0; //1-->1=0
int a;
int sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a);
dis[i+1]=dis[i]+a;
sum+=a;
}
int m;
scanf("%d",&m);
int x,y;
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
if(x>y){
int temp=x;x=y;y=temp;
}
int d1=dis[y-1]-dis[x-1];
if(d1<sum-d1)
printf("%d",d1);
else
printf("%d",sum-d1);
if(i!=m-1)
printf("\n");
}
}