Official

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: