实现
码前思考
- 首先注意到运行时间的限制为200ms,对于一般的OJ系统,1s(即1000ms)中能计算
1
0
7
10^7
107~
1
0
8
10^8
108次。所以我们不能使用暴力的求解,因为暴力解法的时间复杂度为
M
N
MN
MN,大约有
1
0
9
10^9
109方了,所以得想其他方法。
- 既然暴力不行,那么只能另辟蹊径,转换思维,首先
M
M
M是不可能变的,那么只有把
N
N
N变成1,做法就是选取参考系,计算相对距离。
代码实现
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e5+10;
int total;
int dis[maxn];
int n;
int m;
int main(){
scanf("%d",&n);
total = 0;
for(int i=0;i<n;i++){
int d;
scanf("%d",&d);
total = total + d;
dis[(i+2)%(n+1)] = total;
}
dis[1] = 0;
scanf("%d",&m);
for(int i=0;i<m;i++){
int a;
int b;
scanf("%d %d",&a,&b);
if(a < b){
swap(a,b);
}
int d1 = dis[a] - dis[b];
int d2 = total - d1;
printf("%d\n",min(d1,d2));
}
return 0;
}
码后反思
- 要认真分析时间复杂度!
二刷代码
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int sum=0;
int dis[maxn];
int n;
int m;
int main(){
scanf("%d",&n);
dis[1]=0;
int d;
for(int i=2;i<=n;i++){
scanf("%d",&d);
sum+=d;
dis[i]=sum;
}
scanf("%d",&d);
sum+=d;
scanf("%d",&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
int d1 = abs(dis[u]-dis[v]);
int d2 = sum-d1;
printf("%d\n",d1>d2?d2:d1);
}
return 0;
}