ちょっとした算数の問題
問題概要
3 個の整数 が黒板に書かれている。
今、「3 個の整数のうち 1 つを選び、それを 2 倍した値に書き換える」という操作を 回行う。
操作後の 3 個の整数の和の最大値を求めよ。
制約
考えたこと
基本的な戦略としては、「3 個の整数のうち最も大きい整数を 2 倍する」を繰り返していけば良い。なぜならば、大きい整数ほど、2 倍したときの増分も大きいからだ。
そして、「大きい整数を 2 倍にする」を繰り返すということは、「 のうちのどれが最も大きいか」が入れ替わることはないということでもある。
よって、 のうち最大の数(タイがあればどっちでもよい)を選び、それに 2 を 回かければよい。
なお、整数 に 2 をかけたものは C++ では x << 1
と表せる。さらに、整数 に 2 を 回かけたものは 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; }