結果

問題 No.47 ポケットを叩くとビスケットが2倍
ユーザー Takuya ItoTakuya Ito
提出日時 2022-12-17 18:14:40
言語 TypeScript
(5.4.3)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,487 bytes
コンパイル時間 6,692 ms
コンパイル使用メモリ 145,104 KB
最終ジャッジ日時 2024-04-28 12:02:34
合計ジャッジ時間 7,127 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.ts(43,6): error TS2580: Cannot find name 'require'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`.

ソースコード

diff #

function Main(input: string): void {
  // 最終的に実現するビスケットの数
  const target = parseInt(input);

  // 最終的に実現するビスケットの数に対して、法則性を確認する

  // <1>targetが 2の2乗 より大きく 2の3乗 以下の場合は、3回叩くことで実現できるのか
  // <2>targetが 2の3乗 より大きく 2の4乗 以下の場合は、4回叩くことで実現できるのか
  // この<1><2>が成立するのであれば、それ以外のtargetの取る値の範囲においても同様だと言えるはず。

  // <1> 2^2(4) < target <= 2^3(8) なら、3回で全て実現できるのか : 実現できる
  // - 5枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-1)+1*2 = 5
  // - 6枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-2)+2*2 = 6
  // - 7枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-3)+3*2 = 7
  // - 8枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 = 8

  // <上の数式について説明>
  // 例えば5枚にしたい場合、下記のような手順を踏むことになる。上の数式(っぽいもの)ではこれを表現している。
  // - 最初の1枚を叩いて2倍に : 計1枚 * 2倍 = 計2枚
  // - 計2枚すべてを叩いて2倍に : 計2枚 * 2倍 = 計4枚
  // - 計4枚のうち、1枚だけを叩いて2倍に : (計4枚 - 1枚抜く) + 抜いた1枚 * 2倍 = 計5枚

  // <2> 2^3(8) < target <= 16(2^4)なら、4回で全て実現できるのか : 実現できる
  // -  9枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-1)+1*2= 9
  // - 10枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-2)+2*2= 10
  // - 11枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-3)+3*2= 11
  // - 12枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-4)+4*2= 12
  // - 13枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-5)+5*2= 13
  // - 14枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-6)+6*2= 14
  // - 15枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-7)+7*2= 15
  // - 16枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-8)+8*2= 16

  // つまり求めるものは、targetが2の何乗以下なのか
  // 問題の要件よりtargetは 10**8 以下なので、2のべき乗で言うと 2**27 以下まで精査すれば良い
  for (let count = 0; count <= 27; count++) {
    if (target <= 2 ** count) {
      console.log(count);
      break;
    }
  }
}

Main(require("fs").readFileSync("/dev/stdin", "utf8"));
0