PTA A1046 Shortest Distance

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fuckingone/article/details/82502733

又是一道看懂题目意思的英文题,开心(*^▽^*)

 开始写的,会超时。

问题如下:

极端情况下,每次查询都要遍历整个数组,即有10^5次操作,而共有10^4个查询,所以极端情况下会有10^9次操作,时间限时100ms,不能承受。

#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
  int n;
  int a[100010]={0};
  scanf("%d",&n);
    
  for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
      
  }
    
  int m;
  int x1,x2;
  int d1=0;
  int d2=0;
  scanf("%d",&m);
   
  while(m--){
    scanf("%d %d",&x1,&x2);
    for(int i=x1;i!=x2;i++){
      
      d1+=a[i];
      if(i==n){
        i=0;
      }
    }
    for(int i=x2;i!=x1;i++){
      
      d2+=a[i];
      if(i==n){
        i=0;
      }
    }
      
    if(d1<d2)printf("%d\n",d1);
    else printf("%d\n",d2);
    d1=0;
    d2=0;
  }
}

 优化后优点:

①dis[i]表示顺时针方向第1号节点到 第(i+1)号节点的距离。sum表示一圈总距离。可以直接比较dis[]和sum-dis[]。

②dis[]和sum在读入时就可以进行累加得到,这样每次查询就是dis[x2-1]-dis[x1-1]。查询复杂度为O(1)。

③把dis[i]设置为1号节点到 i+1号节点距离,是因为N号到1号距离无法被数组保存。

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;

const int MAXN=100005;
int dis[MAXN],a[MAXN];
int main(){
  int n;
  int sum=0;
  scanf("%d",&n);
    
  for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    sum+=a[i];
    dis[i]=sum;
  }
    
  int m;
  int x1,x2;
  
  scanf("%d",&m);
   
  while(m--){
    scanf("%d %d",&x1,&x2);
    if(x1>x2) swap(x1,x2);
    int temp=dis[x2-1]-dis[x1-1];
    printf("%d\n",min(temp,sum-temp));
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/fuckingone/article/details/82502733