在每一秒可以进行三种操作:闪烁、休息、跑步,闪烁和休息涉及到能量的回复和使用,先计算闪烁得举例,在闪烁的举例的基础上去计算跑步的举例。
f[i]:表示在i秒内移动的最远的举例
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 300010; int m, s, t; int f[N]; int main() { cin >> m >> s >> t; for(int i = 1; i <= t; i ++) { if(m >= 10) f[i] = f[i-1] + 60, m -= 10; else f[i] = f[i-1], m += 4; } int endT = t + 1; for(int i = 1; i <= t; i ++) { if(f[i] - f[i-1] < 17) f[i] = f[i-1] + 17; if(f[i] > s) endT = min(endT, i); } if(f[t] > s) cout << "Yes" << endl << endT << endl; else cout << "No" << endl << f[t] << endl; return 0; }