首页 > 试题广场 >

分数线划定

[编程题]分数线划定
  • 热度指数:6103 时间限制: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)
#n1:报名人数 n2:计划录取人数
n1,n2 = list(map(int,input().split(" ")))
t = int(n2 * 1.5)
grades = {}

for i in range(n1):
    k,s = list(map(int,input().split(" ")))
    grades[k] = s 

result = sorted(grades.items(),key=lambda x:(-1*x[1],x[0]))
line = result[t-1][1]
count = 0
result1 = []
for _,value in result:
    if value >=line:
        result1.append([_,value])
        count +=1 
print("{} {}".format(line,count))
for no,value in result1:
    print('{} {}'.format(no,value))

发表于 2025-12-04 01:50:27 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
struct mianshi{
    int xue;
    int chen;
}a[50001];
bool cmp(mianshi A,mianshi B){
    if(A.chen==B.chen){
        return A.xue<B.xue;
    }else{
        return A.chen>B.chen;
    }
}
int main()
{
    long long n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>a[i].xue>>a[i].chen;
    sort(a,a+n,cmp);
    int t=1.5*m;
    int ans=0;
    //第t名的下标是t-1
    while(ans<n&&a[ans].chen>=a[t-1].chen){
        ans++;
    }
    cout<<a[t-1].chen<<" "<<ans<<endl;
    for(int i=0;i<ans;i++)cout<<a[i].xue<<" "<<a[i].chen<<endl;
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-11-28 16:23:19 回复(0)
import java.util.*;

import static java.util.Comparator.comparing;
import static java.util.Comparator.reverseOrder;

public class pNc_49 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        int need = in.nextInt();
        int m = (int)(1.5*need);
        ArrayList<Integer[]> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Integer[] tmp = new Integer[]{in.nextInt(), in.nextInt()};
            list.add(tmp);
        }

        //Collections.sort
        Collections.sort(list,
                // 第一级:按键 1 的值升序(使用 reversed() 反转默认的升序)
                comparing((Integer[] tmp) -> tmp[1], reverseOrder())
                        // 第二级:按键 2 的值降序
                        .thenComparing((Integer[] tmp) -> tmp[0])
        );


/*        //详情见:https://blog.csdn.net/qq_31635851/article/details/120269813
        //list.sort简略写法
        list.sort(comparing((Integer[] tmp) -> tmp[1], reverseOrder())
                .thenComparing(tmp -> tmp[0])// 编译器可以推断类型
        );*/

        int pass = list.get(m-1)[1];
        int pCount = m;
        for (int i = m; i < num; i++) {
            if (list.get(i)[1]==pass){
                pCount++;
            }else {
                break;
            }
        }
        System.out.println(pass+" "+pCount);
        for (int i = 0; i < pCount; i++) {
            System.out.println(list.get(i)[0]+" "+list.get(i)[1]);
        }

    }
}

发表于 2025-11-24 03:27:34 回复(0)
while True:
    try:
        n, m = map(int, input().split())  # n:总人数, m:计划录取人数
        info = {}
        for _ in range(n):
            idx, score = map(int, input().split())
            info[idx] = score
        # 按规则排序:成绩降序,成绩相同时报名号升序
        sorted_items = sorted(info.items(), key=lambda x: (-x[1], x[0]))
        # 计算面试名额(向下取整)
        t = int(1.5 * m)  # Python的int()对于正数就是向下取整
        # 第t名选手的成绩就是面试分数线
        # 注意:列表索引从0开始,所以第t名对应索引t-1
        score_line = sorted_items[t - 1][1]
        # 所有成绩不低于分数线的选手均进入面试
        # 因为可能有多个同分选手,所以要用 >=
        qualified = {k: v for k, v in sorted_items if v >= score_line}
        # 输出结果
        print(score_line, len(qualified))
        for k, v in qualified.items():
            print(k, v)         
    except:
        break

发表于 2025-11-21 09:25:46 回复(0)
n,m=map(int,input().split())
t=int(m*1.5)
kv={}
for i in range(n):
    a,b=map(int,input().split())
    kv[a]=b
kv1=sorted(kv.items(),key=lambda x: (-x[1],x[0]))#value逆序后key正序
a=kv1[t-1][1]#拿到分数线
kv2=[]
count=0
for j in kv1:
    if j[1]>=a:
        kv2.append(j)#拿所有分数线以上的信息
        count+=1#统计人数
print(str(a)+' '+str(count))
for k in kv2:
    print(' '.join(map(str,k)))
发表于 2025-11-19 17:16:40 回复(0)
while True:
    try:
        dict1 = {}
        l = list(map(int,input().split()))
        # print(l[0]+l[1])
        for i in range(l[0]):
            z = list(map(int,input().split()))
            dict1[z[0]] = z[1]
        list1 = sorted(dict1.items(),key = lambda items:items[1],reverse=True)
        # print(list1)
        sorce_lost = []
        for key,values in dict1.items():
            sorce_lost.append(values)
        sorce_lit = sorted(set(sorce_lost),reverse=True)
        # print(sorce_lit)
        sorce = sorce_lit[2]
        # print(sorce)
   
       
        list3 = [i for i in list1 if i[1]>=sorce]
        # print(list3)
        print(f"{sorce} {len(list3)}")
        for i in list3:
            print(f'{i[0]} {i[1]}',end='\n')

    except:
        break
发表于 2025-10-13 12:24:48 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        admission();
    }

    private static void admission() {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = (int) Math.floor(in.nextInt()*1.5);

        Map<Integer,Set<Integer>> score = new TreeMap<>(Comparator.reverseOrder());
        for (int i = 0; i < n; i++) {
            int id = in.nextInt();
            int s = in.nextInt();
            if (score.containsKey(s)) {
                score.get(s).add(id);
            } else {
                Set<Integer> set = new TreeSet<>();
                set.add(id);
                score.put(s, set);
            }
        }

        int k = 0;
        int jige = 0;
        for (int sc: score.keySet()) {
            k+=score.get(sc).size();
            if (k >= m) {
                jige = sc;
                break;
            }
        }

        System.out.println(jige + " " + k);
        outerLoop:
        while (true) {
            for (int sc: score.keySet()) {
                for (int id:score.get(sc)) {
                    System.out.println(id + " " + sc);
                    k--;

                }
                if (k == 0) {
                    break outerLoop;
                }
            }
        }
    }
}
发表于 2025-10-11 01:13:41 回复(0)
最笨的办法
import java.util.Arrays;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
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)(m * 1.5 ) ;

        int[][] score = new int[n][2];

        //存储所有人的分数
        for (int i = 0; i < n; i++        ) {
            score[i][0] = in.nextInt();
            score[i][1] = in.nextInt();
        }
        // System.out.println(Arrays.toString(score));

        int[] id = new int[n];
        int[] po = new int[n];

        //按分数排序分开存储
        for (int j = 0; j < n; j++) {
            int max = 0;
            for (int i = 0; i < n; i++) {
                max = Math.max(max, score[i][1]);
            }
            for (int i = 0; i < n; i++) {
                if (score[i][1] == max) {
                    id[j] = score[i][0];
                    po[j] = score[i][1];
                    score[i][0] = 0;
                    score[i][1] = 0;
                    break;
                }

            }
            // System.out.println(max);
        }

        // System.out.println(Arrays.toString(id));
        // System.out.println(Arrays.toString(po));

        //如果考号前大后小,交换顺序
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < n - 1; i++) {
                if (po[i] == po[i + 1] && id[i] > id[i + 1]) {
                    int temp = id[i];
                    id[i] = id[i + 1];
                    id[i + 1] = temp;
                }
            }
        }

        //计算分数线,这里一定要t-1,因为po的编号从0开始
        int line = po[t-1];

        //满足分数线的人计数
        int count =0;
        for(int i=0; i<n; i++){
            if(po[i] >=line){
                count++;
            }
        }

        System.out.println(line+" "+count);

        for (int i = 0; i < n; i++) {
            if (po[i] >= line) {
                System.out.println(id[i] + " " + po[i]);
            }
        }

    }
}

发表于 2025-10-08 15:11:11 回复(0)
import math
n,m = map(int,input().split())
ks = []
for i in range(n):
    li = list(map(int,input().split()))
    ks.append(li)
ks_sorted = sorted(ks, key=lambda x: (-x[1],x[0]))
t = math.floor(1.5*m)
line = ks_sorted[t-1][1]
col = [row[1] for row in ks_sorted]
num = len([r for r in col if r >= line])
print(line,num)
for i in range(num):
    print(' '.join(map(str,ks_sorted[i])))
发表于 2025-10-03 13:19:32 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,m;
    cin >> n >> m;
    int t,i,temp=0,count=0;
    vector <vector <int>> ks(n,vector<int>(2));
    t=floor(1.5*m);
    for(i=0;i<n;i++){
        cin >>ks[i][0]>>ks[i][1];
        }
    sort(ks.begin(),ks.end(),[](const vector<int>&a,const vector<int>&b){
        if(a[1]!=b[1])
        return a[1]>b[1];
        else
        return a[0]<b[0];
    });
        int cutoff = (t <= n) ? ks[min(t-1, n-1)][1] : ks.back()[1];
        cout << cutoff <<" ";
    for (auto& row : ks) {
        if (row[1] >= cutoff) {
            count++;
        }
    }
    cout << count << endl;
    for (int i = 0; i < count; i++) {
        cout << ks[i][0] << " " << ks[i][1] << endl;  // 输出编号和分数
    }
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-09-26 17:56:47 回复(0)
import java.util.*;
import java.io.*;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] line1 = bf.readLine().split(" ");
        int n = Integer.parseInt(line1[0]);
        int m = Integer.parseInt(line1[1]);
        ArrayList<Student> list = new ArrayList<>();
        String line;
        while ((line = bf.readLine()) != null) {
            Student s = new Student(Integer.parseInt(line.split(" ")[0]),
                                    Integer.parseInt(line.split(" ")[1]));
            list.add(s);

        }
        list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o2.score - o1.score;//分数从高到低
                //如分数相同再按id排序(升序)
                //如果i非0,直接用分数差的正负值排序
                i = i == 0 ? o1.id - o2.id : i;
                return i;
            }
        });
        int en_num = (int)Math.floor(m *1.5); //实际进面人数由分数线决定,同分可进,大于en_num数
        int en_sco = list.get(en_num - 1).score;
        int count = 0;//统计分数
        for (int i = 0; i < n; i++) {
            if (list.get(i).score < en_sco) {
                break;
            }
            count++;
        }

        // System.out.println(m);
        System.out.println(en_sco + " " + count);
        for (int i = 0; i < count; i++) {
            System.out.println(list.get(i));
        }

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

    @Override
    public String toString() {
        return id + " " + score;
    }
}

发表于 2025-09-20 12:16:52 回复(0)
import java.util.*;
import java.util.stream.Collectors;

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) Math.floor(1.5 * m);
        List<Candidate> candidates = new ArrayList<>();
        while (n-- > 0) {
            int k = in.nextInt();
            int s = in.nextInt();
            Candidate candidate = new Candidate(k, s);
            candidates.add(candidate);
        }
        List<Candidate> collect = candidates.stream().sorted(Comparator.comparing(Candidate::getScore).reversed().thenComparing(Candidate::getId))
                .collect(Collectors.toList());
        int score = collect.get(t - 1).getScore();
        List<Candidate> collect1 = collect.stream().filter(c -> c.getScore() >= score).collect(Collectors.toList());
        System.out.println(score + " " + collect1.size());
        collect1.forEach(c -> System.out.println(c.getId() + " " + c.getScore()));
    }
}

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

    public int getId() {
        return id;
    }

    public int getScore() {
        return score;
    }
}

发表于 2025-09-19 12:21:16 回复(0)
import sys
inputs=[]
for line in sys.stdin:
    a = line.split()
    inputs.append(list(map(int,a)))

n=inputs[0][0]
m=inputs[0][1]
t=int(m*1.5)
p_dict={}
for i in range(n):
    p_dict[inputs[i+1][0]]=inputs[i+1][1]
keys=sorted(p_dict.keys())
values=sorted(p_dict.values())
score=values[-t]

s_dict={}
t_v=0
for k in keys:
    if p_dict[k] >=score:
        t_v+=1
        if p_dict[k] not in s_dict:
            s_dict[p_dict[k]]=[k]
        else: s_dict[p_dict[k]].append(k)

print(score,t_v)

for k in sorted(s_dict.keys())[::-1]:
    vs= s_dict[k]
    for v in vs:
        print(v,k)
发表于 2025-09-14 18:09:13 回复(0)
m,n = map(int,input().split())
dic = {}
for i in range(m):
    key,value = map(int,input().split())
    dic[key] = value

cnt = int(n*1.5) # 向下取整
dic_sort = sorted(dic.items(),key=lambda x:(-x[1],x[0])) # 排序,返回为二维列表

line = dic_sort[cnt-1][1]  # 分数线

# 统计分数线上有多少人
cnt = 0
for i in dic_sort:
    if i[1] >= line:
        cnt += 1
    else:
        break
print(line,cnt)

for i in range(cnt):
    print(dic_sort[i][0],dic_sort[i][1])
发表于 2025-09-11 08:05:49 回复(0)
package main

import (
	"fmt"
	"sort"
)

type Person struct {
    Id int
    Score int
}

func main() {
    n := 0
    m := 0
    fmt.Scan(&n, &m)

    bishi := []Person{}
    scoreMap := map[int]int{}
    for {
        k, s := 0, 0
        n, _ := fmt.Scan(&k, &s)
        if n == 0 {
            break
        }

        scoreMap[s]++

        one := Person{k, s}
        bishi = append(bishi, one)
    }

    mNum := m*3/2

    // fmt.Println(n, m, bishi, mNum)
    sort.Slice(bishi, func(i, j int) bool {
        if bishi[i].Score > bishi[j].Score {
            return true
        } else if bishi[i].Score == bishi[j].Score {
            return bishi[i].Id < bishi[j].Id
        } else {
            return false
        }
    })

    minScore := bishi[mNum-1].Score
    
    for i, v := range bishi {
        if v.Score < minScore {
            mNum = i
            break
        }
    }
    fmt.Println(minScore, mNum)

    for _, v := range bishi {
        if v.Score < minScore {
            break
        }
        fmt.Println(v.Id, v.Score)
    }

}

发表于 2025-09-02 18:08:07 回复(0)
import math
n,m=map(int,input().split())
c=[]
for _ in range(n):
    a,b=map(int,input().split())
    c.append([-b,a])#b.extend([a, b]) =[a,b],c.append([a,b])=[[a,b],]
c.sort()
for i in range(n):
    if c[i][0]<=0:
        c[i][0]=(-c[i][0])
d=math.floor(m*1.5) #m*1.5//1
f=c[d-1][0]
count =0
g=[]
for i in range(n):
    if c[i][0]>=f:
        count +=1
print(f"{f} {count}")
for i in range(count):
    print(f"{c[i][1]} {c[i][0]}")


发表于 2025-09-02 11:54:10 回复(0)