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, 105]), 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 (<=104), 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 107. 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: 5 1 2 4 14 9 3 1 3 2 5 4 1 Sample Output: 3 10 7
这道题画个图会理解的很清楚,需要注意的是时间要求是100ms,所以说 一定要注意尽量不要让计算重复,怎么做那? 就是把它存起来,用空间换取时间。答案中就是用dis数组来储存距离的和 计算的时候只要一个减法就够了。 为了让计算统一,我们可以按顺时针来计算,要求最小值只要取得”,min(temp,sum-temp))就行了。
2017/8/23添加
#include<cstdio> #include<vector> using namespace std; int main(){ int n,m; scanf("%d",&n); vector<int> d(n+1); for(int i=1;i<=n;i++){ scanf("%d",&d[i]); d[i]+=d[i-1]; } scanf("%d",&m); while(m--){ int ans,a,b; scanf("%d%d",&a,&b); if(a>b)swap(a,b); ans=d[b-1]-d[a-1]; printf("%d\n",min(d[n]-ans,ans)); } return 0; }