Greedy の本当に初歩の問題といえる。
問題概要
整数 1 がある。この整数に対して、以下のいずれかの操作を 回行う。
- 操作 A:整数値を 2 倍する
- 操作 B:整数値に
を足す
操作後の整数値の最小値を求めよ。
制約
考えたこと
基本的に、「もとの数が小さいほど、操作後の整数値も小さい」という性質をもつ操作なので、
毎回の操作において、結果が小さいくなる操作 (A, B のうち) を選ぶ
というようにすればよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N, K; cin >> N >> K; int res = 1; for (int i = 0; i < N; i++) { res = min(res * 2, res + K); } cout << res << endl; }