首页 > 试题广场 >

小苯送礼物

[编程题]小苯送礼物
  • 热度指数:5072 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小苯是“小红书app”的一名博主,这天他想要给自己的“铁粉”送一些礼物。

他有 n 名粉丝,编号从 1n,但他只能选择其中 k 名送礼物,他决定选择其中对他支持力度最大的前 k 名粉丝。
(如果两名支持力度相同,则优先选择收藏数更多的,如果都一样,则优先选择编号更小的(因为这意味着他关注小苯的时间更早))

具体的:每名粉丝如果每给小苯点一次赞,则他对小苯就增加了 1 点支持力度,如果他每收藏小苯的一篇文章,则他对小苯增加 2 点支持力度。

现在小苯想知道,他应该选择哪 k 名粉丝送出礼物,请你帮帮他吧。

输入描述:
输入包含 n+1行。
第一行两个正整数 n, k\ (1 \leq k \leq n \leq 10^5),分别表示对小苯有过支持的粉丝个数,以及小苯选择送礼的粉丝个数。
接下来 n 行,每行两个整数 x_i, y_i\ (0 \leq x_i, y_i \leq 10^5),表示第 i 位粉丝给小苯点过 x 次赞,收藏过 y 个小苯的文章。


输出描述:
输出包含一行 k 个正整数,表示小苯选择出送礼物的粉丝们的编号。(按照升序输出)
示例1

输入

4 2
1 2
2 1
3 0
1 3

输出

1 4
n, k = map(int, input().split())
fans = []

for i in range(1, n + 1):
    dz, sc = map(int, input().split())
    support = dz + sc * 2
    fans.append((support, sc, i))


fans.sort(key=lambda x: (-x[0], -x[1], x[2]))
selected = [fans[i][2] for i in range(k)]
selected.sort()
print(' '.join(map(str, selected)))

发表于 2025-11-26 15:05:13 回复(0)
import sys
data = sys.stdin.read().split()
n_num,k_num = int(data[0]),int(data[1])
total_list = []
index = 2
for i in range(1,n_num+1):
    zan = int(data[index])
    cang = int(data[index+1])
    du = zan+2*cang
    total_list.append([i,cang,du])
    index += 2
total_list = sorted(total_list,key=lambda x:(-x[2],-x[1],x[0]))
result = [char[0] for char in total_list[0:k_num]]
result.sort()
print(' '.join(map(str,result)))

发表于 2025-08-22 21:34:37 回复(0)