最短距离

先翻译一下

题目描述

任务非常简单,给出存在于一条公路上的组成一个圆的 N个点,你应该能给出任意一组端点上的最短距离 

输入格式

每个输入文件都包含一个测试实例。

对每个例子来说,第一行包含一个整数N,(大小在3~10^5),紧接着N个整数表示距离D1,D2...DN,Di表示第i和第i+1条边的距离,DN表示第N条边与第一条边的距离。在这行上的所有数据都由一个空格隔开。

第二行给出了一个正整数M(M <= 10^4),下面有M行,每行包含一对出口编号,假设是出口编号从1到N,假设总共的往返距离不超过10^7

输出格式

对于每个测试实例,M行中输出你的结果,每行包含对应给出的那组出口的最短距离

#include <iostream>
using namespace std;

const int n = 100000;
int dist[n];

int main() {
	int M, N;
	cin >> N;	
	int i = 0;
        // 记录边长
	while (i < N) {
		cin >> dist[i++];
	}
	// 记录要查询的端点对数
	cin >> M;
	int a, b;
        // 思路很简单,一个环,被一对端点分成两部分,求这两部分的弧长权重的和,取和小的那部分
	int left = 0, right = 0, j;
	i = 0;
	while (i++ < M) {
		cin >> a;
		cin >> b;
		if (a > b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		a--;
		b--;
		j = a;
		while (j < b) {
			right += dist[j];
			j++;
		}

		while (j < N) {
			left += dist[j];
			j++;
		}
		j = 0;
		while (j < a) {
			left += dist[j];
			j++;
		}

		cout << (right>left ? left : right) << endl;
		left = right = 0;
	}
	return 0;
}

小坑:a,b的取值

有可能a的值比b的值大,所以要调换一下顺序,不然导致逆时针遍历(数组遍历写的是顺时针遍历)无法进行

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值