Official

B - 電気自動車の旅 / Journey of an Electric Vehicle Editorial by MMNMM


高橋君が充電ステーションを訪れたとき、現在のバッテリー残量が \(S _ i\) 未満ならその充電ステーションを利用すべきで、そうでなければ利用しないのがよいです。

あとは、これをもとに先頭の区間からバッテリー残量を確認していけばよいです。

実装例は以下のようになります。 \(S _ i=0\) である充電ステーションを新しく設置しても答えが変わらないことを利用すると実装が簡単になる場合があります。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, M;
    long K;
    cin >> N >> M >> K;

    vector<int> D(N);
    for (int& d : D) {
        cin >> d;
    }

    // 区間 i の直後の充電ステーション(存在しなければ 0)
    vector<int> station(N);
    for (int i = 0; i < M; ++i) {
        int P, S;
        cin >> P >> S;
        station[P - 1] = S;
    }

    // 先頭の区間から実際に走ってみる
    for (int i = 0; i < N; ++i) {
        if (K <= 0) { // 充電がなくなったら
            cout << "No" << endl; // No
            return 0;
        }
        K -= D[i]; // 走って
        K = max<long>(K, station[i]); // 必要なら充電する
    }
    // 走り切れたら Yes
    cout << "Yes" << endl;
    return 0;
}
N, M, K = map(int, input().split())

D = list(map(int, input().split()))

# 区間 i の直後の充電ステーション(存在しなければ 0)
station = [0 for i in range(N)]
for i in range(M):
    P, S = map(int, input().split())
    station[P - 1] = S

# 先頭の区間から実際に走ってみる
for i in range(N):
    if K <= 0: # 充電がなくなったら
        print('No') # No
        break
    K -= D[i] # 走って
    K = max(K, station[i]) # 必要なら充電する
else: # 走り切れたら Yes
    print('Yes')

posted:
last update: