1 条题解
-
0
C. Uninteresting Number(无趣的数字)
题目核心分析
关键知识点
一个数能被 整除的充要条件:它的各位数字之和能被 整除。
操作规则解析
题目允许我们将一个数字 替换为 ,仅当 ,符合条件的数字只有:
- :,差值
- :,差值
- :,差值
- :,差值
其他数字()都无法进行任何操作!
解题思路
- 计算原数字的各位和 ,同时统计字符串中 的数量 、 的数量 ;
- 如果 ,直接输出
YES; - 否则,我们需要通过操作若干个 和 ,让总和增加 ,满足 ;
- 每个 能贡献 ,每个 能贡献 ,我们只需要判断:是否存在 、,使得 。
完整代码(带注释)
#include <iostream> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 加速输入输出,应对大数据 int t; cin >> t; while(t--) { string s; cin >> s; long long sum = 0; // 数字各位和 int cnt2 = 0, cnt3 = 0; // 统计2和3的数量 for(int i = 0; i < s.size(); i++) { sum += s[i] - '0'; if(s[i] == '2') cnt2++; if(s[i] == '3') cnt3++; } // 原本就满足条件,直接输出YES if(sum % 9 == 0) { cout << "YES\n"; continue; } // 需要补充的差值(模9意义下) int need = 9 - sum % 9; bool ok = false; // 枚举使用多少个2和3 for(int i = 0; i <= cnt2; i++) { for(int j = 0; j <= cnt3; j++) { // 2*i + 6*i 是总增量,模9等于需要的差值即可 if((2 * i + 6 * j) % 9 == need) { ok = true; break; } } if(ok) break; } cout << (ok ? "YES" : "NO") << '\n'; } return 0; }
代码细节讲解
-
输入优化
ios::sync_with_stdio(false); cin.tie(nullptr);用于加速大数据输入输出,避免超时(题目数字长度可达 )。 -
统计核心数据 遍历字符串,计算数字和,同时统计可操作的 和 的数量。
-
判断条件 双重循环枚举使用的 和 的数量,检查总增量模 是否等于需要补充的值。
- 每个 贡献
- 每个 贡献
-
输出结果 找到符合条件的组合输出
YES,否则输出NO。
时间复杂度
- 单次测试用例:
- 由于 最大为 (模 下循环 即可),实际复杂度近似
- 整体完全满足题目 长度的限制。
总结
- 本题核心是9的整除特性 + 有限的可操作数字;
- 只有 、 能改变数字和,增量固定;
- 枚举少量组合即可判断答案,代码简洁高效。
- 1
信息
- ID
- 7252
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者