けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 310 A - Order Something Else (7Q, 灰色, 100 点)

問題の入力変数が多いので、読み解くのが大変かもしれないですね。

問題概要

AtCoder ドリンクは定価である  P 円を払えば飲むことができます。

また、割引券を持っており、それを使うと AtCoder ドリンクを定価より安い価格である  Q 円で飲むことができますが、 その場合には AtCoder ドリンクの他に、 N 品ある料理の中から 1 つを追加で注文しなければなりません。

 i=1,2,\dots,N について、 i 番目の料理の価格は  D_{i} 円です。

AtCoder ドリンクを飲むため支払う合計金額の最小値を出力してください。

解法 (C++)

最小値を求める問題では、最小値を表す変数 res を用意してあげて、

res = min(res, (最小かもしれない値の候補));

というように、値 res を更新していくとよいでしょう。他の方法として、

if (res > (最小かもしれない値の候補)) {
    res = 最小かもしれない値の候補;
}

というように、if 文を用いる方法もあるのですが、「不等号の向きがどっちだったっけ......と混乱しやすい」と思います。

それならいっそ、関数 min() を使ってしまった方が分かりやすいでしょう。

以上を踏まえて、最初に変数 resres = P と初期化してあげて、各料理を支払ったときの価格である Q + D[i] と順に比較していけばよいでしょう。

コード例 (C++)

ここでは、価格  D_{1}, D_{2}, \dots, D_{N} を、サイズ  Nvector<int> 型変数として受け取っています。この場合、価格は D[1], D[2], ..., D[N] ではなく、D[0], D[1], ..., D[N-1] となることに注意しましょう。

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 入力を受け取る
    int N, P, Q;
    cin >> N >> P >> Q;
    vector<int> D(N);
    for (int i = 0; i < N; ++i) cin >> D[i];
    
    // まず P 円を求める最小値の初期値に設定しておく
    int res = P;
    
    // Q + D[i] を比べていく
    for (int i = 0; i < N; ++i) {
        // もし res よりも、Q + D[i] の方が小さい場合は更新する
        res = min(res, Q + D[i]);
    }
    cout << res << endl;
}