結果
| 問題 |
No.47 ポケットを叩くとビスケットが2倍
|
| コンテスト | |
| ユーザー |
ふゆふみ🔞ざーめん処理用
|
| 提出日時 | 2015-07-13 16:10:23 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,750 bytes |
| コンパイル時間 | 562 ms |
| コンパイル使用メモリ | 55,004 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-08 07:02:16 |
| 合計ジャッジ時間 | 1,250 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 21 |
ソースコード
#include <iostream>
#include <string>
/*
* 2の指数でビスケットは増えるわけだが,ビスケットは途中で
* 取り出しが可能ゆえに枚数調整ができるということに留意する.
* 1000の例でいく.
* まず2^9までビスケットを増やす = 9回叩く.
* するとビスケットは512となり,このままでは1000をオーバ
* してしまう.が,ここでビスケットをx枚とりだして,
* 2(512 - x) + x = 1000となればうれしい.
* 計算してみると,x = 24となり,無事に1000枚のビスケットを
* 10回のポケット:叩くで取り出すことに成功.
*
* 任意の数Nについて同様の操作が許されれば,
* N ≧ 2^kとなるkを求めるだけで,k + 1回の操作でNを得ることが
* でき最高(叩く回数は,2^k ≧ Nとなる最低のkともいえる).
*
* [証明]
* xが整数となればよい.
* 2(2^k - x) + x = N ここで,k = log_2(N)の下付きカッコ.
* ⇔ 2^(k + 1) - x = N
* kはlog_2(N)の下付きカッコなので,k + 1のとき,
* 2^(k + 1) = N or (N + a) ; aは2^(k + 1) - N
* となる.N∈Z,2^(k + 1)∈Zなので,a∈Z.
* 2^(k + 1) = Nの時は x = 0,N + aのときは x = a.
* a∈Zだったのでxは整数である.
*/
int sumTatakuT( int n )
{
if( n < 0 ){
n = -n;
}
int distance = 0;
bool exponent2 = true;
while( ( n = n >> 1 ) > 0 ){
++distance;
if( n % 2 && n > 1 ){
exponent2 = false;
}
}
return (exponent2 ? distance : distance + 1);
}
int main()
{
std::cout << "number : ";
std::string strn;
std::cin >> strn;
int n = std::stoi( strn );
std::cout << sumTatakuT( n ) << "\n";
return 0;
}
ふゆふみ🔞ざーめん処理用