发寿司 - Handing Out Sushi - Indexed Tree

发寿司

(测试用例总数:X,1.5 秒 (C/C++),2 秒 (Java)/内存限制:256 M,Stack 1 M)

丽雅开了一家寿司店,为了宣传店铺,她想在开业前准备举办一场活动,邀请N位当地居民免费品尝寿司。

为了增加活动的吸引力,她准备按照如下规则来发寿司。首先,让N名参与活动的人排成一队,每人抽取一张写着编号的纸。(编号可能相同。)如果某个人的编号比他前面以及后面的K个人的排序高(编号越小,排序越低),那么这个人拿到的寿司数量比排序低的人多。

丽雅准备按照上述规则来开展活动,同时希望发出去的寿司数量尽可能少。帮助丽雅求出此次活动需要准备的最少寿司数量。

假设当地有7名居民参加了活动,K为2。当7个人抽取的编号分别为 4、3、2、4、1、4、3时,第5个居民的排序为1,因为其他人的排序都比1高,所以他只能获得一个寿司。对于第3个居民,他前面两个人的排序都比他高,后面两个人中有一个居民抽取了更低的排序1,这个人获得了一个寿司,所以第3个居民会获得两个寿司。第7个居民也会获得两个寿司,因为他前面的两个人中有一个人的排序比他的更低,而那个排序更低的人获得了一个寿司。按这种方式计算,可以得出发给参与者的最少寿司数量为 19,如下所示。

1) 第 1 个居民:获得四个寿司
2) 第 2 个居民:获得三个寿司
3) 第 3 个居民:获得两个寿司
4) 第 4 个居民:获得四个寿司
5) 第 5 个居民:获得一个寿司
6) 第 6 个居民:获得三个寿司
7) 第 7 个居民:获得两个寿司

 

[限制条件]

1.参与者数量N为介于1到100,000之间的整数。

2.比较排序的人数K为介于1到100,000之间的整数。

3.每个参与者抽取的编号为介于1到N之间的整数。

(1是最低的编号,编号越大,排序越高。)

4.所有参与者至少会获得一个寿司。

 

[输入]

首先给出测试用例数量T,接着给出T种测试用例。每个测试用例的第一行,给出参与者数量N 和比较排序的人数K。第二行空格区分给出N名参与者抽取的编号。

 

[输出]

各测试用例输出一行。首先输出“#x”(x为测试用例的编号,从1开始),加一个空格后,输出丽雅需要准备的最少寿司数量。

 

[输入输出 示例]

(输入)

2
7 2
4 3 2 4 1 4 3
7 1
4 3 2 4 1 4 3

(输出)

#1 19
#2 12

posted @ 2022-01-20 21:17  晓暮云  阅读(32)  评论(0编辑  收藏  举报