CF792C题解

题面

Description:
给你一个数 \(n\),在其中删除尽可能少的数码,使得得到的数不含前导零且被 \(3\) 整除。
\(n\leq10^{10^5}\)


暴力分类讨论做法。
首先,我们将 \(n\) 的每一位用这一位 \(\bmod3\) 代替,明显的这样不会产生任何影响。
首先关于 \(n\bmod3\) 可以分成三类:

  1. \(n\bmod3=0\),原封不动输出即可。
  2. \(n\bmod3=1\),那要么删除 \(1\)\(1\),要么删除 \(2\)\(2\)
  3. \(n\bmod3=2\),那要么删除 \(2\)\(1\),要么删除 \(1\)\(2\)

现在考虑实现一个函数 \(\operatorname{del}\{a,b\}\) 返回 \(n\) 删除 \(a\)\(b\) 所得到的数。
为了减少前导零的出现,我们采取贪心的方法,从右往左删。删完预定的数字以后,再统一去除前导零。不难证明,这是最优的删数方法。
当然,还有一层特判。如果采用前面的删数方法都无解,但是 \(n\) 的各个数位中本身有 \(0\),那就输出单个 \(0\)。如果没有 \(0\),那显然无解。
注意函数返回值的代码实现。个人认为用全局变量回传会好写一点。但这样别忘记数组的清零。

代码

posted @ 2022-06-05 13:07  1358id  阅读(42)  评论(0编辑  收藏  举报