版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}