A5.分数线划定
2025-08-25 10:10:00
发布于:浙江
12阅读
0回复
0点赞
解题步骤
我们首先可以定义一个结构体node
,用来记录选手的报名号及笔试分数,并用数组 存储起来。由题意得:分数线是以 数组中,按每人的分数从高到低排序后,排名第 的分数来划定的。我们可以记这个分数为 。题目要求我们输出 、分数 的总人数,以及所有 的人的报名号及其分数。定义完结构体和数组后,我们输入笔试人数 、预计人数 ,以及每人的报名号 、分数 。其次,我们将数组 , 按每人的分数从高到低排序(如果分数相同,报名号越小的越前)。然后,我们定义一个类型为node
的vector动态数组 ,用来记录被录取的人的报名号、分数( 的长度就是实际被录取的人数)。最后,输出 、 的长度、 的每一项即可。
正解代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=5e3+10;
struct node{ //定义结构体
int k,s;
}a[N];
bool cmp(node a,node b){ //排序函数
if(a.s!=b.s) return a.s>b.s;
return a.k<b.k;
}
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i].k>>a[i].s;
sort(a+1,a+n+1,cmp); //排序
int temp=a[(int)(m*1.5)].s; //定义分数线
vector<node> v; //用于存储录取人的报名号及其分数
for(int i=1;i<=n;i++){
if(a[i].s>=temp) v.push_back({a[i].k,a[i].s});
}
cout<<temp<<' '<<v.size()<<endl; //v的长度就是录取总人数
for(int i=0;i<v.size();i++){
cout<<v[i].k<<' '<<v[i].s<<endl;
}
return 0;
}
全部评论 1
一定要注意 的下标从 开始
2025-08-12 来自 浙江
0
有帮助,赞一个