A16688 | Loyalty
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
你是一家商店的顾客,想要购买 $n$ 件商品。每件商品 $i$ 的价格为 $a_i$,其中 $1 \leq a_i \leq X$,$X$ 是忠诚度因子。
你在商店的忠诚度等级被定义为 $\lfloor \dfrac{S}{X} \rfloor$,其中 $S$ 是截至目前为止已购买商品的总花费。初始时,$S = 0$。
如果你购买价格为 $p$ 的商品,并且本次购买导致你的忠诚度等级提升,那么你能够获得 $p$ 的奖励点数。
你的任务是,通过选择商品的最佳购买顺序,使奖励点数最大,并输出最大能获得的奖励点数及对应的购买顺序。
你在商店的忠诚度等级被定义为 $\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 \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$ 个整数——表示最佳购买顺序下的商品价格。
如果有多种顺序都能获得最大奖励点数,可以输出其中任意一种。
第一行输出一个整数——在最佳购买顺序下,最多能获得的奖励点数。
第二行输出 $n$ 个整数——表示最佳购买顺序下的商品价格。
如果有多种顺序都能获得最大奖励点数,可以输出其中任意一种。
输入输出样例
输入 #1
7 10 2 1 2 1 2 1 2 1 2 1 2 5 10 2 2 2 2 5 11 23 5 5 22 1 21 2 10 3 1 1 2 1 1 1 1 17 11 3 100 44 32 1 16 100500 42801 73112 95296 68791 42217 21871 29316 84405 24273 42894 63370 53473 57156 61369 80 27290
输出 #1
12 1 2 2 2 2 2 1 1 1 1 5 2 2 2 2 5 53 1 1 5 2 1 2 5 3 10 21 22 1 1 0 11 0 44 32 1 503499 53473 42894 80 57156 42801 61369 42217 63370 29316 68791 27290 73112 24273 84405 21871 95296
在第一个测试用例中:
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$ 个奖励点数。
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$ 个奖励点数。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?