首页 > 试题广场 >

小苯送礼物

[编程题]小苯送礼物
  • 热度指数: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
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int commends;
    int collects;
    int supports;
    int id;
} fllower;
int compare_supports(const void*a,const void*b){
    fllower *fa=(fllower*)a;
    fllower *fb=(fllower*)b;
   if (fa->supports != fb->supports)
        return fb->supports - fa->supports;
        else if(fa->collects!=fb->collects)
        return fb->collects - fa->collects;
        else{
            return fa->id-fb->id;
        }

}
int compare_id(const void*a,const void*b){
    fllower *fa=(fllower*)a;
    fllower *fb=(fllower*)b;
    return fa->id-fb->id;
}
    int main() {
        int n, k;
        scanf("%d %d", &n, &k);
        for (int i = 0; i < n; i++) {

        }
        fllower* fl = (fllower*)malloc(n * sizeof(fllower));
        for (int i = 0; i < n; i++) {
            scanf("%d %d", &fl[i].commends, &fl[i].collects);
            fl[i].supports = 2 * fl[i].collects + fl[i].commends;
            fl[i].id = i + 1;
        }
        qsort(fl, n, sizeof(fllower), compare_supports);
        qsort(fl,k,sizeof(fllower),compare_id);
        for (int i = 0; i < k; i++) {
            printf("%d ", fl[i].id);
        }
        return 0;
    }
发表于 2025-10-22 15:58:35 回复(0)