AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC076-B Addition and Multiplication
■■■問題■■■
square1001は、電光掲示板に整数1が表示されているのを見ました。
彼は、電光掲示板に対して、以下の操作A、操作Bをすることができます。
●操作A: 電光掲示板に表示する整数を「今の電光掲示板の整数を2倍にしたもの」に変える
●操作B: 電光掲示板に表示する整数を「今の電光掲示板の整数にKを足したもの」に変える
square1001は、操作A,操作B 合計でN回行わなければなりません。
そのとき、N回の操作後の、電光掲示板に書かれている整数として考えられる最小の値を求めなさい。
■■■入力■■■
N
K
●1 <= N,K <= 10
●入力はすべて整数である
■■■出力■■■
square1001がN回操作を行った後の、
電光掲示板に書かれている整数として考えられる最小値を出力しなさい。
C#のソース
using System;
using System.Collections.Generic;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("3");
//10
//高橋君は、操作 A, A, B, B の順でやると、整数を最小化できます。
//この時、電光掲示板に書かれている整数は
//1 → 2 → 4 → 7 → 10 と変わり、最終的に10となります。
}
else if (InputPattern == "Input2") {
WillReturn.Add("10");
WillReturn.Add("10");
//76
//高橋君は、操作 A, A, A, A, B, B, B, B, B, B の順にやると、整数を最小化できます。
//この時、電光掲示板に書かれている整数は
//1 → 2 → 4 → 8 → 16 → 26 → 36 → 46 → 56 → 66 → 76 と変わり、
//最終的に76となります。
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int N = int.Parse(InputList[0]);
int K = int.Parse(InputList[1]);
int Answer = int.MaxValue;
for (int LoopACnt = 0; LoopACnt <= N; LoopACnt++) {
int BCnt = N - LoopACnt;
int CurrVal = 1;
for (int I = 1; I <= LoopACnt; I++) {
CurrVal *= 2;
}
CurrVal += BCnt * K;
if (CurrVal < Answer)
Answer = CurrVal;
}
Console.WriteLine(Answer);
}
}
解説
操作Aを10回、操作Bを10回行うのであれば、
操作Bを10回行ってから、操作Aを10回行うのが最適です。
このことをふまえて、
操作Aと操作Bの回数の組み合わせを全探索してます。