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

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

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

#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

猜你喜欢

转载自blog.csdn.net/weixin_71529971/article/details/131690426