【算法练习】A1046.最短距离

题目描述

这项任务非常简单:给定一条高速公路上的N个出口,形成一个简单的循环,你应该说出任何一对出口之间的最短距离。

输入格式

每个输入文件包含一个测试用例。对于每种情况,第一行包含一个整数N(in[3, 1 0 5 {10^5} 105],后跟N个整数距离D1 D2 … DN,其中Di 是第i个出口和(i+1)个出口之间的距离,DN是第N个出口和第一个出口之间的距离。一行中的所有数字都用空格隔开。第二行给出一个正整数M(<= 1 0 4 {10^4} 104),后跟M行,每行包含一对出口编号,前提是出口编号从1到N。保证总往返距离不超过 1 0 7 {10^7} 107

输出格式

对于每个测试用例,以M行打印结果,每行包含相应给定出口对之间的最短距离。

输入用例

5 1 2 4 14 9
3
1 3
2 5
4 1

输出结果

3
10
7

代码

/*永远只有两种距离:
(1)从1-->2-->...-->n的距离dis 
(2)sum-dis 
*/
 
#include<bits/stdc++.h>
using namespace std;

const int MAX = 100001;
int dis[MAX], A[MAX], dis_min[MAX]; 
//dis:1顺时针到i的距离,  A[i]:i到i+1的距离,  dis_min:每次输出的最小距离 

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];
		dis[i] = sum;  
	} 
	scanf("%d", &query);
	for(int i = 0; i < query; i++){
		scanf("%d%d", &left, &right);
		if(left > right) swap(left, right);
		int temp = dis[right-1] - dis[left-1]; //在一段距离中,right是目标, left是起始
		dis_min[i] = min(temp, sum - temp); 
	}
	for(int i = 0; i < query; i++){
			printf("%d\n", dis_min[i]); 
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值