提交时间:2023-05-20 17:18:40

运行 ID: 74156

#include <iostream> #include <cstring> #include <algorithm> using namespace std; int cnt[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; // 数字对应的火柴棒数 int main() { int k; cin >> k; // 求最小值 int min_value = 0x3f3f3f3f; // 初始化为一个极大值 for (int i = 1; i <= 9; ++i) { if (cnt[i] > k) continue; for (int j = 0; j <= 9; ++j) { if (i != 1 && j == 0) continue; // 排除前导零 if (cnt[i] + cnt[j] > k) continue; for (int x = 0; x <= 9; ++x) { if (i != 1 && j == 1 && x != 1) continue; // 最高位是 1 的时候,次高位只能是 1 if (i != 1 && j != 1 && x == 1) continue; // 最高位不是 1 的时候,次高位不能是 1 if (cnt[i] + cnt[j] + cnt[x] == k) min_value = min(min_value, 100 * i + 10 * j + x); } } } // 求最大值 int max_value = 0; if (k % 2 == 0) // 如果 k 是偶数,尽量使用火柴棒数为 1 的数字 { int num = k / 2; while (num--) max_value = max_value * 10 + 1; } else // 如果 k 是奇数 { int num = (k - 3) / 2; max_value = 7; // 尽量使用火柴棒数为 7 的数字 while (num--) max_value = max_value * 10 + 1; // 尽量使用火柴棒数为 1 的数字 } int digits[] = {4, 2, 3, 5, 6, 7, 8, 9, 0}; // 火柴棒数从小到大枚举每个数字(除了 1) for (int i = 0; i < 9; ++i) { int dig = digits[i]; if (cnt[dig] > k) continue; for (int j = 9; j >= 0; --j) { int num = cnt[dig] + cnt[j]; if (num > k) continue; for (int x = 9; x >= 0; --x) { if (dig == 0 && j == 0 && x == 0) continue; // 排除前导零 int temp = num + cnt[x]; if (temp == k) max_value = max(max_value, 100 * dig + 10 * j + x); } } } cout << min_value << " " << max_value << endl; return 0; }