题目
给几个点,让他们围城一个封闭的多边形,然后给出每条边上的权重作为点之间的距离。
要求给出任意两点,求出这两点之间的最近距离
代码和思路
- 计算出整个多边形的路径长度和,然后只需要计算顺时针方向(小下标到大下标)的距离和,然后总的减去顺时针得到逆时针,返回两者最小值即可。
- 不能直接在查询的时候计算顺时针的值,这样会导致循环嵌套,当数据量过于庞大的时候会超时。
- 在读入的时候就进行处理,令 A[i] 来表示i点到0点的距离,这样顺时针距离就可以直接由 A[right - 1] - A[left - 1]得到
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 100005; int main() { int sum = 0, n, query, left, right; int dis[maxn], A[maxn]; //A表示从0走到A需要的路程 scanf("%d", &n); A[0] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &dis[i]); sum += dis[i]; A[i] = sum; } scanf("%d", &query); int temp; for (int i = 0; i < query; i++) { scanf("%d %d", &left, &right); if (left > right) swap(left, right); temp = A[right - 1] - A[left - 1]; printf("%d\n", min(temp, sum - temp)); } return 0; }