题解
2026-05-17 17:52:22
发布于:新疆
1阅读
0回复
0点赞
这道题是一道典型的模拟题,我们只需要按照题目描述的过程一步步模拟即可,注意边界条件的判断。
解题思路
- 初始化:记录当前体力值,准备一个数组记录每个营地的补给量(初始为0,有补给点的营地更新为对应的恢复值)。
- 遍历移动:从营地1到营地N,依次执行:
- 前往下一个营地,消耗对应体力值。
- 判断移动后的体力是否 ≤ 0,如果是,直接判定无法到达,结束流程。
- 到达新营地后,加上该营地的补给值。
- 最终判断:如果成功走完所有营地,输出
Yes;否则输出No。
样例分析
- 样例1
- 初始体力:10
- 营地1→2:消耗5,体力变为5(>0),营地2有补给+10,体力变为15
- 营地2→3:消耗7,体力变为8(>0),无补给
- 营地3→4:消耗5,体力变为3(>0),成功到达,输出
Yes
- 样例2
- 初始体力:10
- 营地1→2:消耗10,体力变为0(≤0),无法继续前进,输出
No
C++ 参考代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
long long T;
cin >> N >> M >> T;
vector<int> A(N - 1);
for (int i = 0; i < N - 1; ++i) {
cin >> A[i];
}
vector<long long> supply(N + 1, 0); // 营地编号1~N
for (int i = 0; i < M; ++i) {
int X, Y;
cin >> X >> Y;
supply[X] = Y;
}
long long current = T;
bool ok = true;
for (int i = 1; i < N; ++i) { // 从营地i到i+1
current -= A[i - 1];
if (current <= 0) {
ok = false;
break;
}
current += supply[i + 1]; // 到达营地i+1后补给
}
cout << (ok ? "Yes" : "No") << endl;
return 0;
}
Python 参考代码
def main():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx]); idx +=1
M = int(data[idx]); idx +=1
T = int(data[idx]); idx +=1
A = list(map(int, data[idx:idx+N-1]))
idx += N-1
supply = [0]*(N+1) # 营地编号1~N
for _ in range(M):
X = int(data[idx]); idx +=1
Y = int(data[idx]); idx +=1
supply[X] = Y
current = T
ok = True
for i in range(1, N):
current -= A[i-1]
if current <= 0:
ok = False
break
current += supply[i+1]
print("Yes" if ok else "No")
if __name__ == "__main__":
main()
复杂度分析
- 时间复杂度:,仅需遍历一次营地和补给点,符合数据范围要求。
- 空间复杂度:,存储营地补给信息。
💡 关键注意点
- 体力值要用
long long(C++)或int(Python天然大整数),防止数值溢出。 - 移动后体力≤0就失败,即使后续有补给也无法继续。
- 补给点是在到达营地后恢复体力,顺序不能搞反。

全部评论 1

1周前 来自 新疆
1




有帮助,赞一个