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

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

AtCoder ABC 149 B - Greedy Takahashi (7Q, 灰色, 200 点)

if 文や else if 文の練習!

問題概要

高橋君は  A 枚、青木君は  B 枚のクッキーをもっている。

高橋君は  K 回次の行動をとる。

  • 自分のクッキーが残っていたら、それを 1 枚食べる
  • 残っていなくて、青木君のクッキーが残っていたら、それを 1 枚食べる
  • どちらのクッキーも残っていなかったら、何もしない

操作後の高橋君、青木君のクッキーの枚数を求めよ。

制約

  •  0 \le A, B, K \le 10^{12}

考えたこと

次のように考えよう。


  •  K \le A のとき:高橋君は自分の分のクッキのみ食べる
    • 高橋君:残り  A - K
    • 青木君:残り  B
  •  A \gt K \le A+B のとき:高橋君は自分の分のクッキーを食べ尽くして青木君のクッキーも食べる
    • 高橋君:残り 0 枚
    • 青木君:残り A+B-K
  •  K \gt A+B のとき:高橋君はすべてのクッキーを食べ尽くす
    • 高橋君:残り 0 枚
    • 青木君:残り 0 枚

なお、2 番目と 3 番目については、まとめて次のように考えても良い。

  • 高橋君:残り 0 枚
  • 青木君:残り  \max(A+B-K, 0)

コード

 A, B, K の制約が  10^{12} と大きいので、C++ では int 型を用いるとオーバーフローしてしまうことに注意しよう。代わりに long long 型を用いている。

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

int main() {
    long long A, B, K;
    cin >> A >> B >> K;
    if (K <= A) cout << A-K << " " << B << endl;
    else cout << 0 << " " << max(A+B-K, 0LL) << endl;
}