题目链接如下:
pat甲级1046
求一个单循环链表的两点间的最短距离
需要注意的是,采用统计某一方向的长度累加会导致超时,本想使用dp算法解决,后来考虑到dp数组的规模,也无法完成
后来注意到可以计算出两点间的距离,因而使用一个数组保存每点距离起点的距离,将最后一个点距离第一个点的距离单独处理,即可轻松解决
AC代码如下:
#include<stdio.h>
int aa[10005];
int num[100005];
int main(){
int M,N,num1,num2,i,a,b,a1,a2,t,znum=0;
num[1]=0;
scanf("%d",&M);
for(i=1;i<M;i++){
scanf("%d",&t);
num[i+1]=num[i]+t;
znum+=t;
}
scanf("%d",&num[M+1]);
znum+=num[M+1];
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&a);
scanf("%d",&b);
num1=0;
num2=0;
if(b>=a){
num1=num[b]-num[a];
}
else{
num1=num[M]-num[a]+num[M+1];
num1+=num[b];
}
num2=znum-num1;
aa[i]= num1<num2? num1:num2;
}
for(i=0;i<N;i++)
printf("%d\n",aa[i]);
return 0;
}