首页 > 试题广场 >

分数线划定

[编程题]分数线划定
  • 热度指数:6995 时间限制: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)
#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)
#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)