A1046 Shortest Distance
自己的做法是每次查询时遍历数组来计算路径,但这样很容易会导致超时,可以在计算sum时顺便把1号节点到i+1号节点的顺时针路径保存,这样可以直接采用这些路径,无需每次都遍历。(i+1是因为i=n时,可以把n到1的顺时针路径保存下来。)dis[i](1<=i<=n)表示1号节点按顺时针方向到达i号节点顺时针方向的下一个结点的距离。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=100005;
int dist[MAXN],A[MAXN];
int main(){
int sum=0,query,n,left,right;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&A[i]);
sum+=A[i];
dist[i]=sum;
}
scanf("%d",&query);
while(query--){
scanf("%d%d",&left,&right);
if(left>right)
swap(left,right);
int temp=dist[right-1]-dist[left-1];
printf("%d\n",min(temp,sum-temp));
}
return 0;
}
浙公网安备 33010602011771号