結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-07-06 08:11:24 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 5 ms / 5,000 ms |
| コード長 | 3,369 bytes |
| コンパイル時間 | 768 ms |
| コンパイル使用メモリ | 87,936 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-01 07:25:36 |
| 合計ジャッジ時間 | 1,692 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
//
// main.cpp
// Q11
//
// Created by AkihiroKOBAYASHI on 7/5/15.
// Copyright (c) 2015 Akhr5884. All rights reserved.
//
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <iomanip>
using namespace std;
string to_binString(unsigned int val){
if( !val ) {
return string("0");
}
string str;
while( val != 0 ) {
if( (val & 1) == 0 ) // val は偶数か?
str.insert(str.begin(), '0'); // 偶数の場合
else
str.insert(str.begin(), '1'); // 奇数の場合
val >>= 1;
}
return str;
}
int canGoValue(string binString) {
int i;
int value = 0;
for(i = 0; i < binString.size(); i++) {
if(binString[i] == '1') {
value++;
}
}
return value;
}
int main(int argc, const char * argv[]) {
using namespace std;
int goalvalue;
int *goalvalueArray;
int i = 0;
queue<int> queue;
cin >> goalvalue;
goalvalueArray = (int*)malloc(sizeof(goalvalueArray) * (goalvalue + 1));
while(i <= goalvalue) {
goalvalueArray[i] = -1;
i++;
}
queue.push(1);
i = 1;
goalvalueArray[1] = 1;
while (queue.size()) {
int i = queue.front();
queue.pop();
int n = i + canGoValue(to_binString(i));
if(n > 0 && n <= goalvalue && goalvalueArray[n] == -1){
queue.push(n);
goalvalueArray[n] = goalvalueArray[i] + 1;
}
n = i - canGoValue(to_binString(i));
if(n > 0 && n <= goalvalue && goalvalueArray[n] == -1) {
queue.push(n);
goalvalueArray[n] = goalvalueArray[i] + 1;
}
}
cout << goalvalueArray[goalvalue] << "\n";
return 0;
}
//#define _CRT_SECURE_NO_WARNINGS
//#define _USE_MATH_DEFINES
//#include <iostream>
//#include <map>
//#include <set>
//#include <list>
//#include <cstdio>
//#include <cmath>
//#include <cstring>
//#include <string>
//#include <vector>
//#include <algorithm>
//#include <utility>
//#include <queue>
//#include <iomanip>
//
//#define SIZE 10001
//
//using namespace std;
//
///* 1のビット数 */
//int numofbits(long bits)
//{
// bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
// bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
// bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
// bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
// return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
//}
//
//int main()
//{
// int d[SIZE];
// int N;
// queue<int> que;
//
// cin >> N;
//
// memset(d, -1, sizeof(d));
//
// que.push(1);
// d[1] = 1;
//
// while (que.size()) {
// int p = que.front();
// que.pop();
//
// int n = p + numofbits(p);
// if (0 < n && n <= N && d[n] == -1) {
// que.push(n);
// d[n] = d[p] + 1;
// }
// n = p - numofbits(p);
// if (0 < n && n <= N && d[n] == -1) {
// que.push(n);
// d[n] = d[p] + 1;
// }
// }
//
// cout << d[N] << endl;
//}