A1046. Shortest Distance (20)

    xiaoxiao2021-12-14  20

    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 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue

    思路:

    用dis[]记录1到所有顶点距离,用a[]记录i到i+1点距离,sum总距离。询问的如1 3,即dis[3]-dis[1],由于不知道顺着还是逆着最小,判断一下就好我错在dis[i+1]+=a[i],应该是dis[i+1]=dis[i]+a[i] #include<cstdio> #include<algorithm> using namespace std; const int MAXN=100050; int min(int a,int b) { if(a>b)return b; else return a; } int main() { int m,n,i,j,sum,left,right; int dis[MAXN],a[MAXN]; dis[1]=0;sum=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); dis[i+1]=a[i]+dis[i]; sum+=a[i]; } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&left,&right); if(left>right) { int t=left; left=right; right=t; } printf("%d\n",min(dis[right]-dis[left],sum-(dis[right]-dis[left]))); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-965332.html

    最新回复(0)