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

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

AtCoder ABC 167 B - Easy Linear Programming (8Q, 灰色, 200 点)

上手に場合分けして解いていこう。

問題概要

1 が書かれたカードが  A 枚、0 が書かれたカードが  B 枚、 −1 が書かれたカードが  C 枚ある。

これらのカードから、ちょうど  K 枚を選んで取るとき、取ったカードに書かれた数の和として、 ありうる値の最大値はいくつか?

考えたこと

できれば 1 が書かれたカードがたくさん欲しいし、できれば -1 が書かれたカードはもらいたくない。

そのような考察に基づいて、次のように整理できる。


  •  K \le A のとき:すべて 1 のカードをとればよい
    • スコアは  K
  •  A \lt K \le A + B のとき:1 のカードを  A 枚とったうえで、残りはすべて 0 のカードをとればよい
    • スコアは  A
  •  K \gt A + B のとき:1 と 0 のカードをすべてとったうえで、 K - A - B 枚は -1 のカードを取らざるをえない
    • スコアは  A + (K - A - B)

コード

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

int main() {
    int A, B, C, K;
    cin >> A >> B >> C >> K;

    if (K <= A) cout << K << endl;
    else if (K <= A + B) cout << A << endl;
    else cout << A - (K - A - B) << endl;
}