1. 题目
2. 分析
任务非常简单:有一个由站点构成的环形圈,每个站点间的距离由题目给出,现要根据给出的两个不同站点,输出他们之间的最短距离。
3. 解题过程
- 对于这种线性模型最简单的方法就是利用作差来求出两点之间的距离:创建一个dis数组,每个坐标代表开始到该站点后一站的距离,如dis[3] 表示 “1”站点到4站点的距离.
- 因为题目给出的坐标不是按小到大给,所以要根据情况进行交换即可。
- 算出来作差的结果后不一定就是最短的距离,只需用总和减该距离就是逆时针计算的另一距离,比较谁短就输出谁即可。
- 请看代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n; scanf("%d", &n);
int sum = 0, left, right, cnt;
vector<int> dis(n+1);
for(int i = 1; i <= n; i++)
{
int temp;
scanf("%d", &temp);
sum += temp;
dis[i] = sum;
}
scanf("%d", &cnt);
for(int i = 0; i < cnt; i++)
{
scanf("%d %d", &left, &right);
if(left > right) swap(left, right);
int temp = dis[right-1]- dis[left-1];
printf("%d\n", min(temp, sum - temp));
}
return 0;
}
4. 小结
- 线性模型,累积相加,作差能线性解决。
- 逆时针总和作差解决。
感谢阅读