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

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

AtCoder ABC 096 B - Maximum Sum (7Q, 灰色, 200 点)

ちょっとした算数の問題

問題概要

3 個の整数  A, B, C が黒板に書かれている。

今、「3 個の整数のうち 1 つを選び、それを 2 倍した値に書き換える」という操作を  K 回行う。

操作後の 3 個の整数の和の最大値を求めよ。

制約

  •  1 \le A, B, C \le 50
  •  1 \le K \le 10

考えたこと

基本的な戦略としては、「3 個の整数のうち最も大きい整数を 2 倍する」を繰り返していけば良い。なぜならば、大きい整数ほど、2 倍したときの増分も大きいからだ。

そして、「大きい整数を 2 倍にする」を繰り返すということは、「 A, B, C のうちのどれが最も大きいか」が入れ替わることはないということでもある。

よって、 A, B, C のうち最大の数(タイがあればどっちでもよい)を選び、それに 2 を  K 回かければよい。

なお、整数  x に 2 をかけたものは C++ では x << 1 と表せる。さらに、整数  x に 2 を  K 回かけたものは x << K と表せる。

コード

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

int main() {
    vector<int> A(3);
    int K;
    cin >> A[0] >> A[1] >> A[2] >> K;

    sort(A.begin(), A.end());
    cout << A[0] + A[1] + (A[2] << K) << endl;
}