CF2161C Loyalty
题目描述
你是一家商店的顾客,想要购买 $n$ 件商品。每件商品 $i$ 的价格为 $a_i$,其中 $1 \leq a_i \leq X$,$X$ 是忠诚度因子。
你在商店的忠诚度等级被定义为 $\lfloor \dfrac{S}{X} \rfloor$,其中 $S$ 是截至目前为止已购买商品的总花费。初始时,$S = 0$。
如果你购买价格为 $p$ 的商品,并且本次购买导致你的忠诚度等级提升,那么你能够获得 $p$ 的奖励点数。
你的任务是,通过选择商品的最佳购买顺序,使奖励点数最大,并输出最大能获得的奖励点数及对应的购买顺序。
输入格式
每个测试包含多组测试用例。第一行为测试用例的数量 $t$($1 \le t \le 2 \cdot 10^4$)。之后是每个测试用例的描述。
每个测试用例的第一行为两个整数 $n$($1 \leq n \leq 10^5$)和 $X$($1 \leq X \leq 10^9$),分别表示商品数量和忠诚度因子。
每个测试用例的第二行为 $n$ 个整数 $a_1, a_2, \ldots, a_n$ ($1 \leq a_i \leq X$),表示每个商品的价格。
保证所有测试用例中 $n$ 的总和不超过 $10^5$。
输出格式
每个测试用例输出两行。
第一行输出一个整数——在最佳购买顺序下,最多能获得的奖励点数。
第二行输出 $n$ 个整数——表示最佳购买顺序下的商品价格。
如果有多种顺序都能获得最大奖励点数,可以输出其中任意一种。
说明/提示
在第一个测试用例中:
1. 购买第一个商品后 $S = 1$,忠诚度等级为 0;
2. 购买第二个商品后 $S = 3$,此时忠诚度等级变为 $1$,获得 $2$ 个奖励点数;
3. 购买第三个商品后 $S = 5$,忠诚度等级变为 $2$,获得 $2$ 个奖励点数;
4. 购买第四个商品后 $S = 7$,忠诚度等级变为 $3$,获得 $2$ 个奖励点数;
5. 购买第五个商品后 $S = 9$,忠诚度等级变为 $4$,获得 $2$ 个奖励点数;
6. 购买第六个商品后 $S = 11$,忠诚度等级变为 $5$,获得 $2$ 个奖励点数;
7. 购买第七个商品后 $S = 12$,忠诚度等级变为 $6$,获得 $1$ 个奖励点数;
8. 购买第八个商品后 $S = 13$;
9. 购买第九个商品后 $S = 14$,忠诚度等级变为 $7$,获得 $1$ 个奖励点数;
10. 购买第十个商品后 $S = 15$。
共获得 $12$ 个奖励点数。
在第二个测试用例中:
1. 前四件商品购买后 $S = 8$,忠诚度等级为 0;
2. 购买最后一件商品后 $S = 13$,忠诚度等级变为 $1$,获得 $5$ 个奖励点数。
在第三个测试用例中:
1. 前八件商品购买后 $S = 20$,忠诚度等级为 0;
2. 购买第九件商品后 $S = 30$,忠诚度等级变为 $1$,获得 $10$ 个奖励点数;
3. 购买第十件商品后 $S = 51$,忠诚度等级变为 $2$,获得 $21$ 个奖励点数;
4. 购买第十一件商品后 $S = 73$,忠诚度等级变为 $3$,获得 $22$ 个奖励点数。
由 ChatGPT 5 翻译