見出し画像

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種類くらい)の入力を行い、想定通りの出力がされるかテストをして、実は間違っていないかを確認する。


この記事が気に入ったらサポートをしてみませんか?