一道简单的贪心题。
既然要最大化数的大小,那么所有的 V
和 I
显然优先用于填充位数,如果连位数都填不满,那么答案一定形如 55...511...1
。
如果 V
和 I
有剩余,那么我们肯定尽可能将 V
放在前面,并用 I
填补剩余的位数。如果还有 I
多余,则考虑从高到低和 V
组成尽可能大的数。例如预先填的是 且此时还有 个 I
剩余,那么我们考虑给第一个 填入 个 I
变成 ,剩余的一个 I
给第二个 ,形成的最大的数就是 ,注意如果填满 还有 多余,可以给 填上。
注意分类讨论和 IO 效率即可通过本题。
#include <cstdio> using namespace std; typedef long long ll; int main() { int cas, cn, ci, cv; scanf("%d", &cas); while (cas--) { scanf("%d%d%d", &cv, &ci, &cn); if (cv + ci <= cn) // 填不满 { for (int i = 0; i < cv; i++) putchar('5'); for (int i = 0; i < ci; i++) putchar('1'); } else if (cv <= cn) { ci -= cn - cv; for (int i = 0; i < cv; i++) // 优先给 5 填 { if (ci >= 3) putchar('8'), ci -= 3; else if (ci >= 0) putchar('5' + ci), ci = 0; } for (int i = cv; i < cn; i++) // 有多的再给 1 填 { if (ci > 2) putchar('3'), ci -= 2; else if (ci >= 0) putchar('1' + ci), ci = 0; } } else // 这是 5 有剩余的情况 { for (int i = 0; i < cn; i++) { if (ci >= 3) putchar('8'), ci -= 3; else if (ci >= 0) putchar('5' + ci), ci = 0; } } putchar('\n'); } return 0; }