总的来说就是能闪则闪,闪烁在能闪时一定比跑的快;分批进行,判断哪个更快;
直接上代码吧,里面有注释,
#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