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