洛谷P1007 独木桥 题解

本文解析了一道关于士兵在桥上行走的算法题目,通过巧妙的角度转换,将问题简化为寻找最大和最小时间单位,避免了复杂的碰撞判断。介绍了如何通过区分左右方向并计算最远距离来更新答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

和《挑战程序设计》的第一题类似,书上说的理解的不是特别清楚。看到洛谷里的一篇题解的思路挺好。

来自https://www.luogu.com.cn/user/30261
你在桥上看风景,看风景的人在轰炸机上看着你。

首先自行脑补一下,假装你正在20000米高空的轰炸机上用高倍显微镜望远镜默默欣赏士兵离开,你会发现什么东西?一堆花花绿绿的迷彩服在移动。(不是鬼片!不是鬼片!不是鬼片!重要的事情说三遍)

那么当两个士兵撞在一起时,从你的视角看会发生什么?当然他们认为他们都掉头了,但因为你在特高的地方,你会认为他们“穿过”了对方。换言之,这与他们相互穿过并没有任何区别。

然后我们就可以把士兵分开了。比方说有一个士兵在位置3,开始时向右,那么一定有一个士兵在两秒后在位置5。虽然这两个家伙可能不是同一个人,但由于士兵都是相同的,我们可以认为他们相同。

那么我们就可以把所有士兵分开。首先,我们把他们一个个读进去。然后,对于每一个士兵,他有向左和向右两种选择。设士兵在位置p,如果向左,需要p时间单位;向右,需要L-p+1个。分别取max和min,更新答案即可。

等于说,不用去考虑士兵回头的情况,相当于他们是透明的,直接穿过去即可。

代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
	int n, l, p;//桥长,士兵数,每个士兵的坐标
	int	maxv = 0, minv = 0;
	cin >> l >> n;
	for (int i = 1;i <= n;i++)
	{
		cin >> p;
		maxv = max(maxv, max(l - p + 1, p));
		minv = max(minv, min(l - p + 1, p));
	}
	printf("%d %d", minv, maxv);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值