문제 링크
문제
입력
첫 줄에는 테스트케이스의 개수 가 주어진다. (1 ≤ T ≤ 20)
각 테스트케이스마다 한 줄에 양의 정수 가 주어진다.
4 × 10^6을 넘지 않는다.
의 총합은
출력
각 테스트케이스마다 한 줄에, 1에서 시작해서 2배를 하거나 1을 빼는 행동을 최소 몇 번 반복해야 를 만들 수 있는지 출력한다.
만약 를 만들지 못한다면, 대신 Wrong proof!를 출력한다.
예제 입력 1
2
1
7
예제 출력 1
0
4
알고리즘 분류
- 그래프 탐색
풀이
1에서 시작해서 BFS로 2배를 하거나 1을 빼면서 K를 최소 몇 번 만에 만들 수 있는지 찾는다.
2배를 할 때, 2배를 한 값이 최대 4,000,000이어야 하며, 1을 뺄 때, 1을 뺀 값이 최소 1이어야 한다.
코드
더보기
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 4000001
#define INF 1e9
#define FASTIO cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
using namespace std;
int T, K;
bool Visited[MAX];
int Answer;
void init() {
for (int i = 0; i < MAX; i++) {
Visited[i] = false;
}
Answer = INF;
}
void BFS() {
queue<pair<int, int> > Q;
Visited[1] = true;
Q.push(make_pair(1, 0));
while (!Q.empty()) {
int NowX = Q.front().first;
int NowC = Q.front().second;
Q.pop();
if (NowX == K) {
Answer = min(Answer, NowC);
return;
}
if ((NowX * 2 <= MAX) && !Visited[NowX * 2]) {
Visited[NowX * 2] = true;
Q.push(make_pair(NowX * 2, NowC + 1));
}
if ((NowX >= 2) && !Visited[NowX - 1]) {
Visited[NowX - 1] = true;
Q.push(make_pair(NowX - 1, NowC + 1));
}
};
}
void settings() {
init();
BFS();
}
void find_Answer() {
cout << Answer << "\n";
}
void input() {
cin >> T;
while (T--) {
cin >> K;
settings();
find_Answer();
};
}
int main() {
FASTIO
input();
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 4] 백준 27919 UDPC 파티(C++) (0) | 2023.07.03 |
---|---|
[BOJ/Silver 2] 백준 28286 재채점을 기다리는 중(C++) (0) | 2023.07.02 |
[BOJ/Silver 4] 백준 28279 덱 2(C++) (0) | 2023.06.28 |
[BOJ/Silver 4] 백준 28278 스택 2(C++) (0) | 2023.06.27 |
[BOJ/Silver 2] 백준 28256 초콜릿 보관함(C++) (0) | 2023.06.25 |