PAT甲级 1046 Shortest Distance (20分)

1046 Shortest Distance (20分)

题目链接:PAT A 1046
在这里插入图片描述
题目大意:输入第一行先给出一个数n,然后给出n个数,代表第i个点到第i+1个点之间的距离。从样例来看,5代表有5个数,后面的1就代表第一个点到第二个点之间的距离是1。这些点形成一个圆,所以最后一个数9代表第5个点到第一个点之间的距离是9。接下来每一行任意给出两个数,要求求出两个数之间的最短距离(顺时针路径和逆时针路径分别可以得到两个距离,输出最小的)。

思路分析1:一开始做的时候,采用了下面这种写法,即遍历的方式,这是非常容易想到的,但是提交上去之后发现最后一个测试点显示运行超时,这是因为题中顶点的个数最大可以达到10的5次方,而查找的次数最大可以有10的4次方,。也就是说,最后一个测试点代表了一种极端情况,复杂度可以达到10的9次方量级。而通常OJ一秒钟能承受最大的量级大概是10的6次方-10的7次方,而题目只给了200ms时间,所以是一定会超时的,故采取另一种解法求解。

超时代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int n, m, a, b;
	scanf("%d", &n);
	vector<int> v(n + 1);
	for(int i = 1; i <= n; i++) 
		scanf("%d", &v[i]);
	scanf("%d", &m);
	for(int i = 0; i < m; i++) {
		int sum1 = 0, sum2 = 0; 
		scanf("%d %d", &a, &b);
		if(a > b)
			swap(a, b);
		for(int j = a; j < b; j++)
			sum1 += v[j];
		for(int j = b; j <= n; j++)
			sum2 += v[j];
		for(int j = 1; j < a; j++)
			sum2 += v[j];
		if(sum1 < sum2)
			printf("%d\n", sum1);
		else
			printf("%d\n", sum2);
	}
	return 0;
}

思路分析2:将所有顶点按照顺时针方向组成一个圆。新建一个dis数组,dis[0]是0(因为顶点是从1开始),dis[i]就代表一号顶点到i+1号顶点的距离,例如dis[3]就代表一号顶点到四号顶点的距离,dis[n]代表n号顶点到1号顶点之间的距离。sum代表这个圈的总距离。以样例为例,如下图所示:
在这里插入图片描述
在输入的时候就可以确定sum和dis[i]的值,如果要求a到b的距离,可以顺时针相加:即dis[b-1]-dis[a-1],也可以逆时针相加:即sum-(dis[b-1]-dis[a-1]),最后输出两者中较小的一个就可以了。

注意点:如果输入的两个顶点是大的数在前面,就需要交换一下这两个数~

AC代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int n, m, a, b, sum = 0;
	scanf("%d", &n);
	vector<int> v(n + 1), dis(n + 1);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &v[i]);
		sum += v[i];
		dis[i] = sum;
	}
	scanf("%d", &m);
	for(int i = 0; i < m; i++) {
		scanf("%d %d", &a, &b);
		if(a > b) //大的数在前面,交换两个数 
			swap(a, b);
		int temp = dis[b - 1] - dis[a - 1];
		printf("%d\n", min(temp, sum - temp)); //输出较小值 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值