CodeForces-1620D Exact Change

CodeForces-1620D Exact Change

tag: *2000;构造,分类讨论,枚举

给定长度为 \(n\) 的序列 \(s\),要求用面值为 \(1,2,3\) 的若干硬币组合成 \(s\) 中的所有数,求最少需要多少枚硬币。

\(1\le t\le1000\)\(1\le n\le100\)\(1\le s_i\le10^9\)

\(A=\max s\),显然最多需要 \(\lfloor A/3\rfloor+2\) 枚硬币,因为 \(\lceil A/3\rceil\)\(3\) 元硬币加上 \(1\)\(1\) 元、\(1\)\(2\) 元,一定可以组成 \(\le A\) 的所有值。

如果没有 \(\bmod 3\)\(1\) 的数,就不需要 \(1\) 元硬币;如果没有 \(\bmod 3\)\(2\) 的数,就不需要 \(2\) 元硬币。

然而,观察这组数据 \(s=(8,10)\),我们发现可以用 \(2\)\(3\) 元硬币和 \(2\)\(2\) 元硬币,而不是 \(3\)\(3\) 元和 \(1\)\(2\) 元、\(1\)\(1\) 元。

也就是说,用 \(2\)\(2\) 元可以代替 \(1\)\(3\) 元加 \(1\)\(1\) 元。

同样地,例如 \(s=(7,8,9)\),可以用 \(2\)\(3\) 元、\(1\)\(1\) 元、\(1\)\(2\) 元,而没必要用 \(3\)\(3\) 元。

综上,设 \(a,b,c\) 分别为 \(1\) 元、\(2\) 元、\(3\) 元硬币的数量,则共有以下几种情况:

  • \((a,b,c)=(0,0,\lfloor A/3\rfloor)\)
  • \((a,b,c)=(1,0,\lfloor A/3\rfloor)\)
  • \((a,b,c)=(0,1,\lfloor A/3\rfloor)\)
  • \((a,b,c)=(0,2,\lfloor A/3\rfloor-1)\)
  • \((a,b,c)=(1,1,\lfloor A/3\rfloor-1)\)
  • \((a,b,c)=(1,1,\lfloor A/3\rfloor)\)

逐个尝试即可。(懒得进行巨大复杂分类讨论了。)

Submission #344422962 - Codeforces

posted @ 2025-10-23 16:39  f2021ljh  阅读(2)  评论(0)    收藏  举报