'commit'
This commit is contained in:
49
TangDou/CSP-J/J2-2024/sticks_prepare_2.cpp
Normal file
49
TangDou/CSP-J/J2-2024/sticks_prepare_2.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
// 声明一个结构体存储每个数字的木棍数
|
||||
struct Node {
|
||||
int num;
|
||||
int cnt;
|
||||
} a[6] = {{0, 6}, {1, 2}, {2, 5}, {4, 4}, {7, 3}, {8, 7}};
|
||||
|
||||
LL mi = LONG_LONG_MAX;
|
||||
|
||||
/*
|
||||
u: 第几个数字
|
||||
sum: 拼接出的数字
|
||||
r: 剩余木棍数
|
||||
*/
|
||||
void dfs(int u, LL sum, int r) {
|
||||
// 递归出口
|
||||
if (r == 0) { // 如果剩余木棍数是0,说明拼接出了一个数字,输出即可
|
||||
mi = min(mi, sum);
|
||||
return;
|
||||
}
|
||||
// 遍历每个可能的数字,如果剩余木棍数够用,就选择这个数字
|
||||
for (int i = 0; i < 6; i++) {
|
||||
if (a[i].cnt <= r) { // 如果剩余木棍数够用,就选择这个数字
|
||||
// 如果当前数字是6,并且是前导零,就选择6,否则选择0
|
||||
int cur = (a[i].num == 0 && u == 1) ? 6 : a[i].num;
|
||||
// 递归调用,拼接出下一个数字
|
||||
dfs(u + 1, sum * 10 + cur, r - a[i].cnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
for (int n = 1; n <= 35; n++) {
|
||||
// 最小值
|
||||
mi = LONG_LONG_MAX;
|
||||
|
||||
// 开启第一轮次,目前拼接出的数字为0,并且还剩18根木棍
|
||||
dfs(1, 0, n);
|
||||
|
||||
// 如果没有找到答案,输出-1
|
||||
if (mi == LONG_LONG_MAX)
|
||||
cout << "n=" << n << ",ans=" << -1 << endl;
|
||||
else
|
||||
cout << "n=" << n << ",ans=" << mi << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user