1046 Shortest Distance 发表于 2020-05-30 地铁环状线两点之间的距离为t,最小值为t或则是周长-t。(t为按起点到终点由小到大,大减小而来) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <iostream>using namespace std;int main() { int n; scanf("%d", &n); int dis[n + 2] = {0}; int sum = 0, left, right, cnt; for (int i = 1; i <= n; i++) { int t; scanf("%d", &t); sum += t; dis[i + 1] = sum; } // dis[i]表示i点的绝对距离,dis[1] = 0,dis[n+1]意思是走一圈的距离 scanf("%d", &cnt); for (int i = 0; i < cnt; i++) { scanf("%d %d", &left, &right); if (left > right) { swap(left, right); } int t = dis[right] - dis[left]; printf("%d\n", min(t, dis[n + 1] - t)); } return 0;}5 1 2 4 14 931 32 54 13107// 也可以用 for(int i = 1; i <= n; i++) { int temp; scanf("%d", &temp); sum += temp; dis[i] = sum; }// 表示的是从第一个点到i下一个点的距离// 所以dis[n]是从第一点到n点再毁1点的距离(即总长)// 两点距离得用int temp = dis[right - 1] - dis[left - 1];来表示。// 比如2 6,temp = dis[2-1]-dis[6-1],// 因为dis[1]表示从1点到2点的距离,dis[5]表示从1点到6点的距离