题意:给出一个环和结点之间的距离,求任意两结点之间的最近距离。如图:
思路:令数组dis[i]表示1号结点逆时针至i号结点的距离,初始化dis[1]=0,其他值在输入是确定,即
dis[i] | 0 | 1 | 3 | 7 | 21 |
i | 1 | 2 | 3 | 4 | 5 |
这样,起点start和终点end之间逆时针方向的距离即为 d=abs(dis[end]-dis[start]) ,注意要加绝对值,不然,比如起点4到终点2的距离是dis[2]-dis[4]=-6,就为负了。同时用total记录环的总距离,起点start和终点end之间逆时针方向的距离即为 total-d 。对于任意两结点u,v之间的最短距离,就是其顺时针和逆时针距离最较小值。
代码:
#include <cstdio> #include <cstdlib> #define MIN(x,y) (x)<(y)?(x):(y) const int N=100010; int dis[N]={0}; int main() { int n,d,total=0;//total表示总的距离 scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&d); total+=d; dis[i+1]=d+dis[i]; } int m,s,e; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d%d",&s,&e); d=abs(dis[e]-dis[s]); printf("%d\n",MIN(d,total-d)); }
return 0; }