Addition and Multiplicationの問題
標準入力
N、K
Nは整数、Kも整数
ディスプレイに表示されている現在の整数は1である。この数字からスタートして、次の操作を行う。
操作A:現在の整数を2倍する。
操作B:現在の整数にKを足す。
操作A、または操作BをN回繰り返すとき、最小値を求めよ。という問題。
僕が考えた解き方
前回の操作で2倍かK足すかを行ったことを次回の処理に反映する必要があるので、ループ処理とsum+=Kやsum*=2を組み合わせれば、前回の操作の結果が次回の処理に反映されると考えた。
そこで、1から始まる現在の値をint sum = 1;とした。
前回の値に対する操作A、操作Bを比べて、小さい方を採用する。
→(前回の値)*2、(前回の値)+Kの大小を比較。
→sum*2、sum+Kの値の大小を比較。
大小の比較について、僕の場合は、こんな感じに考えた。
(操作A)ー(操作B)>0なら、操作Bの方が値が小さいということなので、操作Bを採用し、sum+=Kを実施する。
例:
操作A:sum*2=2*2=4
操作B:sum+1=2+1=3
操作A=4、操作B=3で操作Bの方が小さいので、Bを採用。
→sum+=Kを実行する。
それ以外「(操作A)ー(操作B)<=0」なら、sum*=2
→(sum*2)ー(sum+K)<=0なら、sum*=2
そして、下のコードを作成し、何種類かの入力で試して、いけそうだったので、提出、正解になりました。怪しいかなと思ったけど、いけました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int N,K;
cin >> N >> K;
int sum = 1;
for(int i = 0; i < N; i++){
if((sum * 2) - (sum + K) > 0){
sum += K;
} else {
sum *= 2
}
}
cout << sum << endl;
}
僕は、if((sum * 2) - (sum + K) > 0)としたけど、
シンプルに、
if(sum * 2 > sum + K )
とすればいいことに、後で模範解答を見て気付きました。
コードを作成するコツが少し分かってきた
これまでコードを書いてきて、コツが少しつかめてきた気がしたので、書いておきます。
・まず手書きのノートにいろいろ書く。
・ノート上で具体的な入力をして、手書きで処理結果がどうなるのか書く。
・コードテストにコードを書いて実行。コードが微妙だと思ったら、任意の箇所でデバッグ代わりにcoutを使って、思ったとおりの出力がされるか確認したい結果を出力させる。
・コードテストでいろんなケース・複数種類(少なくとも3種類くらい)の入力を行い、想定通りの出力がされるかテストをして、実は間違っていないかを確認する。
この記事が気に入ったらサポートをしてみませんか?