#include <iostream>
#include <vector>
int arr[9] = { 0, 0, 1, 7, 4, 2, 0, 8, 10 };
long long DP[101] = {};
int main()
{
int N = 0;
std::cin >> N;
for (int i = 1; i < 9; ++i)
{
DP[i] = arr[i];
}
DP[6] = 6;
for (int i = 9; i < 101; ++i)
{
DP[i] = DP[i - 2] * 10 + arr[2];
for (int j = 3; j < 8; ++j)
{
DP[i] = std::min(DP[i], DP[i - j] * 10 + arr[j]);
}
}
for (int i = 0; i < N; ++i)
{
int iNumber = 0;
std::cin >> iNumber;
std::cout << DP[iNumber] << " ";
while (iNumber)
{
if (iNumber % 2 != 0)
{
std::cout << 7;
iNumber -= 3;
}
else
{
std::cout << 1;
iNumber -= 2;
}
}
std::cout << "\n";
}
return 0;
}
최솟값 구하기 위해서 좀 헷갈렸다.
처음에는 7을 빼고 나머지를 구했는데 200일 때랑 688일 때의 갯수가 같아서 문제가 되었다...
자꾸 손으로 풀려는 경향이 있는데... DP나 이분 탐색을 좀 잘 이용할 수 있어야 할 것 같다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 11501 주식 (0) | 2022.06.18 |
---|---|
[C++] 백준 4179 불! (0) | 2022.06.18 |
[C++] 백준 19637 IF문 좀 대신 써줘 (0) | 2022.06.17 |
[C++] 백준 2512 예산 (0) | 2022.06.16 |
[C++] 백준 20006 랭킹전 대기열 (0) | 2022.06.16 |