问题要求进行 m 轮淘汰,每轮在当前序列中找到一个能力值最小的人员,若有多个则淘汰原下标最小的那个。直接模拟时间复杂度过高,需要更高效的做法。
注意到淘汰规则实际上是按照「能力值从小到大,同能力值按下标从小到大」的顺序依次删除元素。整个淘汰过程等价于:
(能力值, 原下标) 的二元组,按字典序从小到大排序;在一场安排中,有 n 个人员排成一列,每个人员有一个能力值 pi。现需淘汰 m 个能力最低的人员。淘汰过程如下:每次从当前队列中选出一个能力值最小的人员,若有多个,则淘汰位置最靠前(原序列下标最小)的那个。请你求出 m 轮淘汰后,仍然留在队列中的人员的能力值,并按原始顺序输出。
数据约束:
第一行输入一个整数 T,表示测试数据组数。 接下来依次描述每组数据: 第一行包含两个整数 n 和 m,分别表示总人数和需要淘汰的人数。 第二行包含 n 个整数 p1,p2,…,pn,表示初始序列中的能力值。
对于每组数据,输出一行,包含剩余人员的能力值,按原始相对顺序用空格分隔。
输入
1
5 3
2 3 2 1 2
输出
3 2
说明
初始序列能力值为 2 3 2 1 2。需要淘汰 m=3 个最小值。按照规则,每次选取当前最小值,若相同则取最靠前的下标。值 1 最少且只有下标 3 一个,首先淘汰;剩余需要淘汰 2 个。当前剩余序列为 2 3 2 2,最小值为 2,有下标 0、2、4 共三个,按原下标从小到大淘汰前两个,即淘汰下标 0 和 2 的 2。最终剩余下标 1 和 4 的元素,能力值分别为 3 和 2,按原始顺序输出 3 2。
输入
1
4 0
4 1 3 2
输出
4 1 3 2
说明
m=0 表示不需要淘汰任何人。因此直接按原始顺序输出全部 4 个能力值 4 1 3 2。
输入
1
4 3
4 2 3 1
输出
4
说明
需要淘汰 m=3 个人,最后只会留下 1 个人。序列为 4 2 3 1,按规则依次淘汰最小值:1(下标 3)、2(下标 1)、3(下标 2)。最后剩下能力值为 4 的元素(下标 0),输出 4。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册