| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 83008 | sh25_shenpy | 守望者的逃离 | C++ | 解答错误 | 1 MS | 240 KB | 3093 | 2026-01-18 21:03:21 |
#include <iostream> #include <algorithm> using namespace std; int main() { int M, S, T; cin >> M >> S >> T; int current_magic = M; // 当前魔法值 int current_dist = 0; // 当前移动的距离 int time_used = 0; // 已用时间 bool escape = false; // 是否成功逃离 int escape_time = T + 1; // 逃离的最短时间(初始设为比最大时间大) // 逐秒模拟(最多T秒) while (time_used < T) { // 优先使用闪烁(魔法足够) if (current_magic >= 10) { current_dist += 60; current_magic -= 10; time_used++; } else { // 魔法不足,判断是否值得休息恢复魔法后闪烁 // 计算需要休息多久才能凑够10点魔法 int need_rest = (10 - current_magic + 3) / 4; // 向上取整,如差7点需2秒(2*4=8≥7) int remain_time = T - time_used; // 剩余时间 if (need_rest < remain_time) { // 休息后还能闪烁,且闪烁的收益 > 跑步收益 // 休息need_rest秒 + 闪烁1秒:总耗时need_rest+1秒,移动60m // 直接跑步need_rest+1秒:移动17*(need_rest+1)m if (60 > 17 * (need_rest + 1)) { // 选择休息+闪烁 time_used += need_rest; current_magic += need_rest * 4; // 恢复魔法 // 修正魔法值(避免超过需求) current_magic = min(current_magic, 10); continue; // 回到循环开头,下一秒用闪烁 } } // 不值得休息,直接跑步 current_dist += 17; time_used++; } // 检查是否已到达出口 if (current_dist >= S) { escape = true; escape_time = time_used; break; } } // 处理最后一秒(可能time_used=T时刚好到达) if (!escape && current_dist < S) { // 若最后一秒还能移动(比如time_used=T但还没循环) // 补充:逐秒循环到time_used=T时,最后一次移动后检查 // 额外处理:若剩余时间为0,但还能跑/闪(比如time_used=T时刚好移动) // 优化:直接计算剩余时间能跑的距离 int remain_time = T - time_used; current_dist += 17 * remain_time; // 再次检查是否到达(极端情况:最后几秒跑步刚好到) if (current_dist >= S) { escape = true; escape_time = T; } } // 输出结果 if (escape) { cout << "Yes" << endl; cout << escape_time << endl; } else { // 修正:若闪烁/跑步超过S,按S算;否则按实际距离 current_dist = min(current_dist, S); cout << "No" << endl; cout << current_dist << endl; } return 0; }