A1046 Shortest Distance (20 point(s))

简单圈内两点最短距离计算

1. 原文

原题

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,$10^5]$), 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 (≤$10^4$), 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 $10^7$.

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:

1
2
3
4
5
5 1 2 4 14 9
3
1 3
2 5
4 1

Sample output:

1
2
3
3
10
7

2. 解析

有n个结点围成一个圈,相邻两个点之间的距离已知,每次只能移动到相邻点。询问A和B之间的最短距离。

如1,2,3,4,5

1 3: 从1号到3号的最短距离为3 路径为1->2->3

2 5: 从2号到5号的最短距离为10 路径为2->1->5

4 1: 从4号到1号的最短距离为7 路径为4->3->1

Solution:

用num[i]表示1号结点按顺时针方向到达”i号结点顺时针方向的下一个结点”,sum表示一圈总距离。每个查询left->right,结果就是num(left,right) 和sum-num(left, right)之间的较小值。

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<cstdio>
int num[100010]={};
int main(){
int n;
scanf("%d",&n);
int sum = 0;
for (int i = 1; i <= n; ++i)
{
int a;
scanf("%d",&a);
sum+=a;
num[i] = num[i-1]+a;
}
int m;
scanf("%d",&m);
for (int i = 0; i < m; ++i)
{
int a,b;
scanf("%d%d",&a,&b);
int temp = 0;
if (a>b)
{
temp = num[a-1]-num[b-1];
}else{
temp = num[b-1]-num[a-1];
}
if (sum-temp>temp)
{
printf("%d\n",temp);
}else{
printf("%d\n", sum-temp);
}
}

return 0;
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/03/A1046/
  • 发布时间: 2019-09-03 12:34
  • 更新时间: 2021-10-29 14:01
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!