2024 小木棍 · 方案二 预处理最小数字表
先打出每种根数对应的最小数字
正文
// CSP-J 2024 复赛 T3 · 小木棍(方案二)
// 原题:https://oj.yecheng.tv/p/ccf-CSPJ2024C
//
// 方案二 · 预处理「花 c 根能拼出的最小数字」
// 方案一每一位都要把 0 到 9 试一遍。其实同一根数下哪个数字最小是固定的,
// 可以先打成两张表:
// 花 2 根 -> 1 花 3 根 -> 7 花 4 根 -> 4
// 花 5 根 -> 2 花 6 根 -> 0 花 7 根 -> 8
// 另外准备一份「不含 0」的版本给首位用(花 6 根时首位只能选 6,不能选 0)。
// 于是每一位只要算出「这一位允许花几根」的区间,再在表里取最小值就行:
// 剩下 left 位时,这一位最少要花 rest - 7 * left 根、最多花 rest - 2 * left 根,
// 再和 [2, 7] 取交集即可。整体 O(len),比方案一少一个 10 倍常数。
#include <bits/stdc++.h>
using namespace std;
int match[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
// minDigit[c]:正好花 c 根时能拼出的最小数字(可以是 0)
int minDigit[8] = {0, 0, 1, 7, 4, 2, 0, 8};
// minDigitNz[c]:同上但不能是 0,给首位用
int minDigitNz[8] = {0, 0, 1, 7, 4, 2, 6, 8};
int main() {
freopen("sticks.in", "r", stdin);
freopen("sticks.out", "w", stdout);
int T;
cin >> T;
while (T--) {
long long n;
cin >> n;
int len = (int)((n + 6) / 7);
if (len < 1) len = 1;
if (2LL * len > n) {
cout << -1 << "\n";
continue;
}
long long rest = n;
string ans;
for (int i = 0; i < len; i++) {
long long left = len - i - 1;
long long a = max(2LL, rest - 7LL * left); // 这一位最少花几根
long long b = min(7LL, rest - 2LL * left); // 最多花几根
int best = 10;
for (long long c = a; c <= b; c++) {
int d = (i == 0 ? minDigitNz[c] : minDigit[c]);
best = min(best, d);
}
ans += char('0' + best);
rest -= match[best];
}
cout << ans << "\n";
}
return 0;
}
CSP-J 标程 · 复赛真题的其它内容
- 2019 数字游戏 · 方案一 逐字符统计
- 2019 数字游戏 · 方案二 二进制位运算
- 2020 优秀的拆分 · 方案一 贪心从大到小减
- 2020 优秀的拆分 · 方案二 直接看二进制位
- 2021 分糖果 · 方案一 枚举每个 k
- 2021 分糖果 · 方案二 看余数在哪一段
- 2022 乘方 · 方案一 边乘边判断
- 2022 乘方 · 方案二 快速幂加封顶
- 2023 小苹果 · 方案一 照规则真模拟
- 2023 小苹果 · 方案二 只盯住两个数字
- 2024 扑克牌 · 方案一 用集合去重
- 2024 扑克牌 · 方案二 二维布尔表
- 2025 拼数 · 方案一 收集后降序排序
- 2025 拼数 · 方案二 桶计数
- 2019 公交换乘 · 方案一 暴力匹配
- 2019 公交换乘 · 方案二 时间窗口优化
- 2020 直播获奖 · 方案一 每轮排序
- 2020 直播获奖 · 方案二 桶计数
- 2021 插入排序 · 方案一 每次真排一遍
- 2021 插入排序 · 方案二 增量维护有序表
- 2022 解密 · 方案一 二分求整数平方根
- 2022 解密 · 方案二 先估后校开方
- 2023 公路 · 方案一 朴素贪心
- 2023 公路 · 方案二 单调栈预处理
- 2024 地图探险 · 方案一 四方向分支写
- 2024 地图探险 · 方案二 方向数组
- 2025 座位 · 方案一 把座位表填出来
- 2025 座位 · 方案二 直接算排名
- 2019 纪念品 · 方案一 逐天完全背包
- 2019 纪念品 · 方案二 砍掉不赚钱物品
- 2020 表达式 · 方案一 每次重算后缀式
- 2020 表达式 · 方案二 建树加关键性传播
- 2021 网络连接 · 方案一 手写解析
- 2021 网络连接 · 方案二 读入后回拼校验
- 2022 逻辑表达式 · 方案一 递归分治
- 2022 逻辑表达式 · 方案二 递归下降
- 2023 一元二次方程 · 方案一 照公式逐步写
- 2023 一元二次方程 · 方案二 拆成小函数
- 2024 小木棍 · 方案一 先定位数再贪心
- 2025 异或和 · 方案一 贪心能接就接
- 2025 异或和 · 方案二 动态规划加值域数组
- 2019 加工零件 · 方案一 递归加记忆化
- 2019 加工零件 · 方案二 奇偶最短路
- 2020 方格取数 · 方案一 深搜回溯
- 2020 方格取数 · 方案二 按列动态规划
- 2021 小熊的果篮 · 方案一 每轮扫一遍
- 2021 小熊的果篮 · 方案二 链表加有序集合
- 2022 上升点列 · 方案一 先只考虑不加点
- 2022 上升点列 · 方案二 二维动态规划
- 2023 旅游巴士 · 方案一 分层图加优先队列
- 2023 旅游巴士 · 方案二 状态压成一维
- 2024 接龙 · 方案一 按定义广搜
- 2024 接龙 · 方案二 滑动窗口逐轮推进
- 2025 多边形 · 方案一 枚举所有子集
- 2025 多边形 · 方案二 排序加计数 DP