首页 > 试题广场 >

小苯送礼物

[编程题]小苯送礼物
  • 热度指数: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
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    let fanNum = 0; // 粉丝数
    let giftNum = 0; // 送礼数
    let scoreNum = [];  // 得分
    let fan = 1; // 当前粉丝编号
    while(line = await readline()){
        if (fanNum == 0) {
            let lineArr = line.split(' ');
            fanNum = Number(lineArr[0]);
            giftNum = Number(lineArr[1]);
        } else {
            let lineArr = line.split(' ');
            // 点赞数,收藏数,得分,粉丝编号
            scoreNum.push([
                Number(lineArr[0]),
                Number(lineArr[1]),
                Number(lineArr[0]) +  Number(lineArr[1]) * 2,
                fan,
             ]);
            fan ++;
        }
    }

    // 利用sort 排序 ,计算出礼物权重,按照升序排,最后只需要输出数组的前两位的粉丝编号
    // a 是后项
    // b 是前项
    // return 1不交换位置,-1交换ab位置
    scoreNum.sort((a,b) => {
        if (a[2] > b[2]) {
            return -1;
        } else if (a[2] < b[2]) {
            return 1; // 把比分按照从大到小排序
        } else if (a[2] == b[2]) {
            // 下面写同分数判断收藏数量的
            if (a[1] > b[1]) {
                return -1;
            } else if (a[1] < b[1]) {
                return 1;
            } else if (a[1] == b[1]) {
                //同分数同收藏,判断序号
                if (a[0] > b[0]) {
                    return 1;
                } else {
                    return -1;
                }
            }
        }
    })
   
    // 结果编号数组
    let res = [];
    for (let i = 1; i <= giftNum; i++) {
        res.push(scoreNum[i-1][3]);
    }

    // 输出按大小排序
    console.log(res.sort((a,b) => a-b).join(' '));
}()

发表于 2025-08-12 22:20:04 回复(0)