Official
B - 山頂への登山 / Climbing to the Summit Editorial
by
B - 山頂への登山 / Climbing to the Summit Editorial
by
kyopro_friends
問題文の指示通り、実際に \(N\) 個の区間の移動をシミュレーションすることで解けます。
現在の体力と、バテ状態であるか否かを表すフラグを持ちながらシミュレーションします。山小屋の情報は辞書で保持するか予め配列に変換するなどして「区間 \(i\) を通過した直後にいくら体力が回復するか」を取得できるようにしておくのが便利です。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m;
long long s;
cin >> n >> m >> s;
vector<int> d(n);
for(int i=0; i<n; i++) cin >> d[i];
// 山小屋の情報を配列に変換しながら読み込み
vector<int> r(n);
for(int i=0; i<m; i++){
int p, rr;
cin >> p >> rr;
r[p-1] = rr;
}
// ok が True ならバテていない、Falseならバテている
bool ok = true;
for(int i=0; i<n; i++){
// 区間の通過
if(ok){
s -= d[i];
}else{
s -= 2 * d[i];
}
// バテ判定
if(s <= 0){
ok = false;
}
// 回復
s += r[i];
}
cout << s << endl;
}
実装例 (Python)
N, M, S = map(int,input().split())
D = list(map(int,input().split()))
# 山小屋の情報を配列に変換しながら読み込み
R = [0] * N
for _ in range(M):
p, r = map(int,input().split())
R[p-1] = r
# ok が True ならバテていない、Falseならバテている
ok = True
for i in range(N):
# 区間の通過
if ok:
S -= D[i]
else:
S -= 2 * D[i]
# バテ判定
if S <= 0:
ok = False
# 回復
S += R[i]
print(S)
posted:
last update:
