首页 > 试题广场 >

分数线划定

[编程题]分数线划定
  • 热度指数:9027 时间限制: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 人。
class Interviewee:
    def __init__(self,id:int,score:int):
        self.id = id
        self.score = score
    def __repr__(self):
        return f'{self.id} {self.score}'

def main():
    n,m = map(int,input().split())
    t = int(m * 1.5)

    interviewees = []

    for _ in range(n):
        id,score = map(int,input().split())
        interviewees.append(Interviewee(id,score))
    
    interviewees_sorted = sorted(interviewees,key = lambda x : (-x.score,x.id))

    targe_score = interviewees_sorted[t-1].score

    selected = []

    cur_index = 0
    while interviewees_sorted[cur_index].score >= targe_score:
        selected.append(interviewees_sorted[cur_index])
        cur_index += 1



    print(f'{selected[-1].score} {len(selected)}')

    for interviewee in selected:
        print(interviewee)
    

    

if __name__ == '__main__':
    main()

发表于 2025-11-21 15:34:52 回复(0)
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        int t = (int) (m * 1.5);
        List<Candidate> candidates = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int k = scanner.nextInt();
            int s = scanner.nextInt();
            candidates.add(new Candidate(k, s));
        }

        // 排序:成绩从高到低,成绩相同报名号从小到大
        // Override Comparator比较器
        candidates.sort((o1, o2)-> {
            if (o1.score != o2.score) return o2.score - o1.score;
            else return o1.id - o2.id;
        });

        int line = candidates.get(t - 1).score;
        int cnt = 0;
        List<Candidate> interviewCandidates = new ArrayList<>();
        for (Candidate candidate : candidates) {
            if (candidate.score >= line) {
                interviewCandidates.add(candidate);
                cnt++;
            }
        }

        System.out.println(line + " " + cnt);
        for (Candidate candidate : interviewCandidates) {
            System.out.println(candidate.id + " " + candidate.score);
        }

        scanner.close();
    }
}

class Candidate {
    int id;
    int score;

    public Candidate(int id, int score) {
        this.id = id;
        this.score = score;
    }
}

发表于 2025-08-29 15:33:35 回复(0)
import math
n,m = map(int,input().split())
dic = {}
for i in range(n):
    k,s = map(int,input().split())
    dic[k] = s
sorted_dic = dict(sorted(dic.items(),key=lambda x:(x[1],-x[0]),reverse=True))
t = math.floor(1.5*m)
line = sorted_dic[list(sorted_dic.keys())[t-1]]
answer_dic = {}
for key in sorted_dic.keys():
    if sorted_dic[key]>=line:
        answer_dic[key] = sorted_dic[key]
    else:
        break
cnt = len(answer_dic.keys())

print(f'{line} {cnt}')
for key in answer_dic.keys():
    print(f'{key} {answer_dic[key]}')
发表于 2025-08-25 23:05:28 回复(0)

这里主要是学习sort自定义排序算法。

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    int t=floor(m*1.5);
    vector<pair<int,int>> v(n);

    while (n--) {
        int k,s;
        cin>>k>>s;
        v.push_back({k,s});
    }

    sort(v.begin(), v.end(),[](const auto& a ,const auto & b){
        return a.second==b.second?a.first<b.first:a.second>b.second;
    });

    int lines=v[t-1].second;
    int ci=0;
    for(int i=0;i<v.size();i++){
        if(v[i].second>=lines){
            ci++;
        }
    }

    cout<<lines<<" "<<ci<<endl;

    for(int i=0;i<ci;i++){
        cout<<v[i].first<<" "<<v[i].second<<endl;
    }





}
发表于 2025-08-05 23:32:28 回复(0)
题目说向下取整结果答案是四舍五入,同样的分数顺序不一样也算错😅
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[][] p = new int[n][2];
        for(int i=0;i<n;i++){
            p[i][0] = in.nextInt();
            p[i][1] = in.nextInt();
        }
        Arrays.sort(p, (o1, o2)->o2[1]-o1[1]);
        int t = Math.round(1.5f*m);
        System.out.println(p[t-1][1]+" "+t);
        for(int i=0;i<t;i++){
            System.out.println(p[i][0]+" "+p[i][1]);
        }
    }
发表于 2026-03-10 11:25:52 回复(0)
easy
from math import floor
m,n = map(int,input().split())
res = []
for _ in range(m):
    i,score = map(int,input().split())
    res.append((score,i))
res.sort(key= lambda x:(-x[0],x[1]))
t = floor(1.5*n)
line = res[t-1][0]
for j in range(t,len(res)):
    if res[j][0]==line: t+=1
print(line,t)
for j in range(t):
    print(res[j][1],res[j][0])


发表于 2026-03-08 17:39:57 回复(0)
这道题,刚入手,会被这个二组数据难到,所以,做这道题的关键是会:1.快速排序:.快速排序:
#include <stdlib.h>
qsort(a, n, sizeof(int), cmp)//a为数组,n为长度,当cmp_asc为负数,进行升序;
反之,倒叙
//int cmp(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}a-b<0,a在前,b在后;
2.建立数据库,理解->和.的c语言含义
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int id;
int grate;
}AD;//数据库的设立
int cump(const void *a,const void *b){
AD *ab=(AD*) a;
AD *ac=(AD*) b;
if(ab->grate!=ac->grate){
return ac->grate - ab->grate;}
else{
return ab->id - ac->id;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
AD str[n];
for(int i=0;i<n;i++){
scanf("%d%d",&str[i].id,&str[i].grate);
}
qsort(str,n,sizeof(AD),cump);
int b=1.5*m;

int count =0;
for(int i=0;str[i].grate>=str[b-1].grate;i++){
count++;
}
printf("%d %d\n",str[b-1].grate,count);

for(int i=0;str[i].grate>=str[b-1].grate;i++){

printf("%d %d\n",str[i].id,str[i].grate);
}

}


发表于 2026-03-02 10:51:51 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,m;cin>>n>>m;
    int t=floor(1.5*m);
    auto cmp=[](const pair<int,int>& a,const pair<int,int>& b){
        if(a.first!=b.first) return a.first>b.first;
        return a.second<b.second;
    };

    multiset<pair<int,int>,decltype(cmp)>num(cmp);
    while(n--){
        int k,s;cin>>k>>s;
        num.insert({s,k});
    }
    int cnt=0,line=0;
    for(auto it=num.begin();it!=num.end();it++){
        cnt++; 
        if(cnt==t){
            line=it->first;
            auto next_it=it;
            next_it++;
            while(next_it!=num.end()&&next_it->first==line){
                cnt++;
                next_it++;
            }
            break;
        }
    }
    cout<<line<<' '<<cnt<<endl;
    int i=0;
    for(auto it=num.begin();it!=num.end()&&i<cnt;it++,i++){
        cout<<it->second<<' '<<it->first<<endl;
    }
    
}

发表于 2026-02-27 21:55:39 回复(0)
package main

import (
	"fmt"
	"sort"
)

func main() {
	n := 0
	m := 0
	fmt.Scan(&n, &m)
	persons := make([][2]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&persons[i][0], &persons[i][1])
	}
	sort.Slice(persons, func(i, j int) bool {
		if persons[i][1] == persons[j][1] {
			return persons[i][0] < persons[j][0] // 小到大
		}
		return persons[i][1] > persons[j][1] // 高到低
	})
	t := int(float64(m) * 15 / 10)
	if t > len(persons) {
		t = len(persons)
	} else {
		for t < len(persons) {
			if persons[t-1][1] == persons[t][1] {
				t = t + 1
			} else {
				break
			}
		}
	}
	line := persons[t-1][1]
	fmt.Printf("%v %v\n", line, t)
	for i := 0; i < t; i++ {
		fmt.Printf("%v %v\n", persons[i][0], persons[i][1])
	}
}

发表于 2026-02-25 23:30:24 回复(0)
using System;
using System.Collections.Generic;
public class Program {
    public static void Main() {//算法非常经典的入门题
    //刚学acm时都会做
    //此题考验 自定义sort的考察,大概无论什么语言都能自定义sort
        string line;
        line = System.Console.ReadLine();
        string[] parts =line.Split( );
        int n = int.Parse(parts[0]);
        int m = int.Parse(parts[1]);
        int t =(int )(1.5*m);

        List<person> lis = new List<person>();
        for(int i=0;i<n;++i){
            parts=System.Console.ReadLine().Split( );
            lis.Add(new person(int.Parse(parts[0]) ,int.Parse( parts[1]) ));
        }
        lis.Sort( (a,b)=>{
            int cmp = b.score.CompareTo(a.score);
            //cmp 只有三种植 -1 0 1
            //在sort返回值中 -1代表着 a在前面 0不变 1 a在后面
            //在c# 中 应该所有简单类型都内置了 CompareTo
            //所以a.CompareTo(b) 是升序 反过来是降序
            return cmp ==0? a.name.CompareTo(b.name) : cmp;

        }  );
        int innum=0;
        int inscore = lis[t-1].score;
        for(int i=0;i<n;++i){
            if(lis[i].score >= inscore){
                innum ++;
            }

        }
        Console.WriteLine(inscore +" " +innum);
        for(int i=0;i<innum;++i){
            
                Console.WriteLine(lis[i].name + " "+lis[i] .score );
            
        }


    }
    public class person{
        public int score;
        public int name;
        public person( int n,int s ){
            name= n;
            score =s;
            

        }
    }
}

发表于 2026-02-25 20:15:28 回复(0)
//咕咕嘎嘎
import java.util.*;
class App {
    int id;
    int score;

    public App(int id, int score) {
        this.id = id;
        this.score = score;
    }
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            App[] s = new App[a];
            for (int i = 0; i < a; i++) {
                s[i] = new App(in.nextInt(),in.nextInt());
            }
            Arrays.sort(s, (s1, s2) -> {
                // 第一步:分数降序(核心:s2.score - s1.score)
                if (s1.score != s2.score) {
                    return s2.score - s1.score;
                }
                // 第二步:分数相同时,ID降序(核心修改:s2.id - s1.id)
                else {
                    return s1.id - s2.id; // ID降序,无需嵌套if,差值直接搞定
                }
            });
            int c = (int)Math.floor(b*1.5);
            c = Math.min(c, a);
            c = Math.max(c, 1);
            int cnt = 0;
           
            System.out.print(s[c-1].score+" ");
            for (App app : s) {
                if (app.score >= s[c-1].score) {
                    cnt++;
                }
            }
            System.out.println(cnt);
            for(int i = 0;i<cnt;i++){
                System.out.print(s[i].id);
                System.out.print(" ");
                System.out.println(s[i].score);
            }
           

        }
        in.close();
    }
}
发表于 2026-02-11 17:34:18 回复(0)
初学者献丑了。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int t = (int)(1.5 * m);
        HashMap < Integer, Integer > map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            map.put(in.nextInt(), in.nextInt());
        }
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
        list.sort(Map.Entry.comparingByKey());
        list.sort(Map.Entry.comparingByValue(Collections.reverseOrder()));
        int score = 0;
        if (t <= n) {
            for (int l = 0; l < n; l++) {
                if (list.get(l).getValue() >= list.get(t - 1).getValue()) {
                    score ++;
                }
            }
        } else {
            score = n ;
        }
        System.out.println(list.get(score - 1).getValue() + " " + score);
        for (int j = 0; j < score; j++) {
            System.out.println(list.get(j).getKey() + " " + list.get(j).getValue());
        }
    }
}
发表于 2026-02-09 22:42:13 回复(0)
#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;
}
发表于 2026-01-20 17:25:39 回复(0)
#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>
class Student{
    public:
    Student(int id,int grade){
           this->mid=id;
           this->mgrade=grade;
    }
    int mid;
    int mgrade;
};
class mysort{
    public:
    bool operator()(Student s1,Student s2){
        if(s1.mgrade==s2.mgrade){
            return s1.mid<s2.mid;
        }
         return s1.mgrade>s2.mgrade;
    }
};

int main() {
   int m,n;
   cin>>n>>m;
   vector<Student>v;
   while(n--){
    int k,s;
    cin>>k>>s;
    Student stu(k,s);
    v.push_back(stu);
   }
   sort(v.begin(),v.end(),mysort());
    double t=m*1.5;
    t=int(t);
    int t_grade=v[t-1].mgrade;
   // cout<<t<<endl;
     cout<<t_grade<<" ";
      int joinnumber=0;
   for_each(v.begin(),v.end(),[&](Student s){
         if(s.mgrade>=t_grade){
            joinnumber++;
         }
   });
   cout<<joinnumber<<endl;
   for(int i=0;i<joinnumber;i++){
         cout<<v[i].mid<<" "<<v[i].mgrade<<endl;
   }


}
// 64 位输出请用 printf("%lld")

发表于 2026-01-17 22:11:15 回复(0)
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

bool sortcmp(pair<int,int>a,pair<int,int>b){
    if(a.second!=b.second) return a.second>b.second;
    else return a.first<b.first;
}

bool idxcmp(pair<int,int>a,pair<int,int>b){
    return b.second<a.second;
}

int main() {
    int n, m;
    cin >> n >> m;

    int cnt = 1.5*m;
    vector<pair<int, int>> Info;

    for(int i=0;i<n;i++){
        int number,score;
        cin>>number>>score;
        Info.emplace_back(number,score);
    }
   
    sort(Info.begin(),Info.end(),sortcmp);
    int line = Info[cnt-1].second;

    pair<int,int> target = {-1,line};

    auto it = upper_bound(Info.begin(), Info.end(), target, idxcmp);
    int tmp = distance(Info.begin(), it);
    cnt = max(cnt,tmp);

    cout<<line<<" "<<cnt<<endl;

    for(auto it=Info.begin(); it<Info.begin()+cnt;it++){
        cout<<it->first<<" "<<it->second<<endl;
    }

}
// 64 位输出请用 printf("%lld")
发表于 2026-01-16 10:39:49 回复(0)
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) {
        vector<pair<int, int>> infor(n);
        int k, s;//k 是 报名号,s 是笔试成绩
        for (int i = 0; i < n; ++i) {
            cin >> k >> s;
            infor.emplace_back(k,
                               s);//直接在容器的内存空间里 “就地” 创建元素,省去拷贝 / 移动的开销。
        }
        sort(infor.begin(), infor.end(), [](const auto & a, const auto & b) {
            return a.second == b.second ? a.first<b.first: a.second>b.second;
        }); //按第二列降序排序,若第二列值相等,按第一列升序

        int num = floor(m * 1.5);
        int score_line = infor[num - 1].second;
        int cnt = 0;
        for (auto& i : infor) {
            if (i.second >= score_line)
                ++cnt;
        }
        cout << score_line << " " << cnt << endl;
        for (int j = 0; j < cnt; ++j) {
            cout << infor[j].first << " " << infor[j].second << endl;
        }
    }
    return 0;
}

发表于 2026-01-11 16:37:50 回复(0)
n,m=map(int,input().split(' '));aa=[];fs=[];t=int(1.5*m)

for i in range(n):
    a,b=map(int,input().split(' '))
    aa.append((a,b));fs.append(b)

aa.sort(key=lambda t:(-t[1],t[0]))

if t>=n:
    li_ne=min(fs);cnt=n
else:
    li_ne=aa[t-1][1];cnt=sum(list(1 for x in fs if x >= li_ne))
    
print(li_ne,cnt)
for i in range(cnt):
    print(aa[i][0],aa[i][1])

发表于 2026-01-10 20:03:41 回复(0)
num,jnt = input().split(' ')  # 接收 报名人数 和 计划录取人数
cnt = int(int(jnt)*1.5)  # 确定面试名额
list1 = []
while True:
    try:
        idx,score = input().split(' ')  # 获取每个人的报名号和成绩,并以空格分割
        list1.append((int(idx),int(score)))  # 将报名号和成绩转化为整数型添加进list1列表
    except:
        break
list1.sort(key= lambda x: (-x[1],x[0]))  # 对list1中每个元素(每个人的报名号和成绩组成的元组),以成绩降序(-x[1])报名号升序(x[0])进行排序
line = list1[cnt-1][1]  # 确定面试分数线(计划录取4人,就取出列表第4位(索引为4-1=3)报名人的成绩

list2 = []
num = 0  # 初始化统计面试人数
for i in list1:  # 对已经排序后的list1,取出每一位报名人的信息(报名号,成绩)
    if i[1] >= line:  # 判断:如果报名人的成绩在面试分数线及以上
        num += 1  # 面试人数+1
        list2.append(i)  # 将报名人添加进待面试名单

print(line,num)  # 打印分数线和面试人数
for i in list2:  # 循环取出待面试名单中的报名人信息
    print(i[0],i[1])  # 打印报名人的报名号和成绩


发表于 2026-01-07 11:39:03 回复(0)
l=input().split(" ")
n=int(l[0])
m=int(l[1])
d={}
for i in range(n):
    l2=input().split(" ")
    k=int(l2[0])
    s=int(l2[1])
    d[k]=s

t=int((1.5*m)//1)

l2=list(d.items())
l2.sort(key=lambda x:(-x[1],x[0]))
score_line = l2[t-1][1]
actual_t = t
for i in range(t, len(l2)):
    if l2[i][1] == score_line:
        actual_t += 1
    else:
        break
print(l2[t-1][1],actual_t,sep=" ")
for i in range(0,actual_t):
    print(l2[i][0],l2[i][1],sep=" ")


发表于 2026-01-07 00:26:28 回复(0)
import math
# 定义两个整数分别表示报名人数与计划录取人数
n,m = map(int,input().split())
# 定义一个字典,用于存储笔试者序号及笔试成绩
dict_score = {}
# 进行笔试人序号及成绩的输入
for _ in range(n):
    k,s = map(int,input().split())
    dict_score[k] = s
tuple_score = sorted(dict_score.items(), key=lambda x: (-x[1], x[0]))
# print(tuple_score)
t = math.floor(1.5 * m)
x = tuple_score[t-1][1]
count = 0
for j in dict_score.values():
    if j >= x:
        count+=1
print(f"{x} {count}")
for i in range(n):
    if tuple_score[i][1] >= x:
        print(f"{tuple_score[i][0]} {tuple_score[i][1]}")
代码有点拉跨,胜在便于理解
发表于 2025-12-26 16:21:50 回复(0)