P1095 [NOIP2007 普及组] 守望者的逃离

该程序解决了一个问题,即在给定跑步和闪烁的能力限制下,判断在多少时间内能到达目标距离。通过动态规划计算每秒跑步和闪烁所能达到的最远距离,选择最快的方式。如果在时间T内能到达目标S,则输出Yes和所需时间;否则输出No和最后达到的距离。

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

总的来说就是能闪则闪,闪烁在能闪时一定比跑的快;分批进行,判断哪个更快;

直接上代码吧,里面有注释,

#include <iostream>

using namespace std;

const int N = 3e5 + 5;
int M, S, T, blue[N], dp[N];
//dp[i] 第i秒跑(闪)出的最远距离
//blue[i] 第i秒全靠用蓝闪出的距离

int main() {
	cin >> M >> S >> T;
	for (int i = 1; i <= T; i ++) {
		//跑
		dp[i] = dp[i - 1] + 17;

		//能闪则闪
		if (M >= 10)
			blue[i] = blue[i - 1] + 60, M -= 10;

		//不闪休息
		else
			blue[i] = blue[i - 1], M += 4;

		if (dp[i] < blue[i]) //闪的更快
			dp[i] = blue[i];

		if (dp[i] >= S) { //到啦
			cout << "Yes" << '\n' << i;
			return 0;
		}
	}
	//完了,到不了
	cout << "No" << '\n' << dp[T];
	return 0;
}

题目链接: https://www.luogu.com.cn/problem/P1095

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值