A1046 Shortest Distance 20分
题目描述:
刚开始做的时候,由于翻译错了题目导致做得不是很顺畅,三个点超时了一个。
思路:
以dis[i]表示从1号顶点以顺时针方向到i+1号顶点的距离,sum表示为一圈的总距离,于是对每个顶点都有总距离=顺时针+逆时针,以顶点V3为例,总距离等于顺时针V1->V2->V3的距离加上V1->V5->V4->V3,也就是逆时针距离=sum-dis[2]。接着比较顺时针和逆时针的距离输出较小的就好了。
需要注意的是给出初始顶点(以x表示)不一定都小于终止顶点(以y表示)。需要判断,当x>y时,交换两者的值就好了。
代码描述:
#include<bits/stdc++.h>
const int N=100005;
using namespace std;
int n,m,dis[N],a[N],sum;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
dis[i]=sum;
}
cin>>m;
while(m--){
int x,y;
cin>>x>>y;
if(x>y) swap(x,y);
int temp=dis[y-1]-dis[x-1];
if(temp<sum-temp) cout<<temp<<endl;
else cout<<sum-temp<<endl;
}
return 0;
}