PAT 1046. Shortest Distance (20)

来源:互联网 发布:淘宝上买刀具犯法吗 编辑:程序博客网 时间:2024/05/22 21:15

1046. Shortest Distance (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 931 32 54 1
Sample Output:
310

7

自己的代码。思路就是sum2=sum-sum1。然而每次直接一项一项加求sum1会超时。在上次的sum1基础上处理成现在的sum1。

#include<string>#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<algorithm>#include<map>#include<vector>using namespace std;long int a[100001];  int main(){     long int n;     cin>>n;     long int sum=0;     for(long int i=1;i<=n;i++)        {scanf("%ld",&a[i]);           sum+=a[i];        }      long int m;      cin>>m;      long int xx,yy;      long int x,y;      long int sum1=0,sum2=0;      scanf("%ld %ld",&x,&y);      if(x>y){            long int tmp=x;            x=y;            y=tmp;          }          long int gg;       for(long int i=x;i<y;i++)             sum1+=a[i];             sum2=sum-sum1;             gg=sum1>sum2?sum2:sum1;          printf("%ld\n",gg);          xx=x;yy=y;      for(long int i=1;i<m;i++)      {          scanf("%ld %ld",&x,&y);          if(x>y){            long int tmp=x;            x=y;            y=tmp;          }          if(x!=xx)          {              if(x>xx)                 for(long int j=xx;j!=x;j++)                   sum1-=a[j];              else               for(long int j=x;j!=xx;j++)                 sum1+=a[j];          }          if(y!=yy)          {              if(y>yy)                 for(long int j=yy;j!=y;j++)                   sum1+=a[j];              else               for(long int j=y;j!=yy;j++)                 sum1-=a[j];          }             sum2=sum-sum1;             gg=sum1>sum2?sum2:sum1;             xx=x;yy=y;          printf("%ld\n",gg);      }       return 0;}


然后看了下别人代码,更简单,本质是利用HASH的思想,将所有1到i的距离都提前存起来。到时候减一减就好

#include<string>#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<algorithm>#include<map>#include<vector>using namespace std;long int a[100001]={0}; //  a[i]表示从1号节点到i+1号的距离  int main(){     long int n;     cin>>n;     long int tmp=0;     for(long int i=1;i<=n;i++)        {scanf("%ld",&tmp);           a[i]=a[i-1]+tmp;        }      long int m;      cin>>m;      for(long int i=0;i<m;i++)      {            long int x,y;          scanf("%ld %ld",&x,&y);          if(x>y){            long int tmp=x;            x=y;            y=tmp;          }          long int zz=a[y-1]-a[x-1];        zz=min(zz,a[n]-zz);          printf("%ld\n",zz);      }       return 0;}


原创粉丝点击