首页 > 试题广场 >

分数线划定

[编程题]分数线划定
  • 热度指数:7034 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}某市为世博会选拔志愿者,先进行笔试,再按笔试成绩划定面试分数线。规则如下:
\hspace{23pt}\bullet\, 计划最终录取 m 名志愿者;
\hspace{23pt}\bullet\, 面试名额定为 m150\%,向下取整,记为 t=\left\lfloor 1.5m \right\rfloor
\hspace{23pt}\bullet\, 将所有报名号及笔试成绩按成绩从高到低、成绩相同报名号从小到大排序;
\hspace{23pt}\bullet\,t 名选手的成绩即为面试分数线
\hspace{23pt}\bullet\, 所有笔试成绩不低于该分数线的选手均进入面试。

\hspace{15pt}请输出面试分数线及所有进入面试选手的信息(按排序后的顺序)。

输入描述:
\hspace{15pt}第一行输入两个整数 n,m\left(5\leqq n\leqq 5000;\ 3\leqq m\leqq n\right),分别表示报名人数与计划录取人数。
\hspace{15pt}接下来 n 行,每行输入两个整数 k,s\ (1000\leqq k\leqq 9999;\ 1\leqq s\leqq 100),分别为报名号与笔试成绩。报名号保证唯一。


输出描述:
\hspace{15pt}第一行输出两个整数:面试分数线 \textit{line} 与进入面试的人数 cnt
\hspace{15pt}接下来 cnt 行,按排序顺序输出每位选手的报名号 k 与成绩 s,每行两个整数,用空格分隔。
示例1

输入

6 3
9848 90
6731 88
1422 95
7483 84
8805 95
4162 88

输出

88 5
1422 95
8805 95
9848 90
4162 88
6731 88

说明

计算:t=\lfloor1.5\times3\rfloor=4,第 4 名成绩为 88,故分数线 =88;所有 \geqq88 的共有 5 人。
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    int score;
} Student;

int cmp(const void *a, const void *b) {
    Student *s1 = (Student *)a;
    Student *s2 = (Student *)b;
    if (s1->score != s2->score) {
        return s2->score - s1->score;
    }
    return s1->id - s2->id;
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
   
    Student *students = (Student *)malloc(n * sizeof(Student));
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &students[i].id, &students[i].score);
    }
   
    qsort(students, n, sizeof(Student), cmp);
   
    int t = (3 * m) / 2;
    if (t > n) t = n;
   
    int line = students[t-1].score;
   
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (students[i].score >= line) {
            cnt++;
        }
    }
   
    printf("%d %d\n", line, cnt);
    for (int i = 0; i < n; i++) {
        if (students[i].score >= line) {
            printf("%d %d\n", students[i].id, students[i].score);
        }
    }
   
    free(students);
    return 0;
}
发表于 今天 17:25:39 回复(0)