A1046

n个节点围成一个环,每个节点之间的距离已知。输入n并给出n个节点的距离,输入m组节点编号(两个),求这两个节点编号间的最短距离。

1 建立dis[]数组,记录V1点到每一个点的顺时针距离,sum计算环的总距离。

2 输入m组节点编号,如果左边的值大于右边的值,则使用swap()函数将其交换。

3 计算temp=dis[right-1]-dis[left-1],比较temp和sum-temp,输出最小的即为最短距离。

注1:swap()函数即将两个变量交换:swap(a,b);

注2:#include<algorithm>:包含swao()和min()两个函数的函数库,当要使用这两个函数的时候需要写在开头。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAXN=100005;
 5 int dis[MAXN];
 6 int main(){
 7     int sum=0,tem,query,n,left, right;
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++){
10         scanf("%d",&tem);
11         sum+=tem;
12         dis[i]=sum;
13     }
14     scanf("%d",&query);
15     for(int i=0;i<query;i++){
16         scanf("%d%d",&left,&right);
17         if(left>right) swap(left,right);//交换left和right
18         int temp=dis[right-1]-dis[left-1];
19         printf("%d\n", min(temp,sum-temp)); 
20     }
21     
22         return 0;
23 } 

 

------------恢复内容结束------------

posted @ 2019-12-20 15:13  老葛  阅读(209)  评论(0编辑  收藏  举报