解题思路:
1.由题可得,对于面试者的笔试成绩进行排序,分数高的在前,如果分数相同的话,学号在前
2.设置结构体变量,包含两个成员变量学号和成绩
3.输入n个参赛者的学号和成绩,然后将规定格式排序
4.确定录取人数,为m1的1.5倍向下取整,int num=m1*1.5;现在保证有num个人数被录取了,但是第num个人的成绩可能有成绩相等的,所以需要找是否和m[num].score相等的分数,如果有,num++,代表录取人数加1,直到成绩不相等为止
5.输出m[num].score和num
6.输出前num个参赛者的学号和成绩
#include<bits/stdc++.h>
using namespace std;
struct node{
int num;
int score;
}m[5005];
bool cmp(node a,node b)
{
if(a.score!=b.score)//如果分数不一样,分数大的在前
return a.score>b.score;
else
return a.num<b.num;//如果总分相等,学号小的在前
}
int main()
{
int n,m1;
cin>>n>>m1;
for(int i=1;i<=n;i++)
scanf("%d%d",&m[i].num,&m[i].score);
sort(m+1,m+n+1,cmp);
int num=m1*1.5;//num为通过面试的人数
while(1)//找到和最后一名分数线相等的面试者
{
if(m[num].score==m[num+1].score)
num++;
else
break;
}
cout<<m[num].score<<" "<<num<<endl;
for(int i=1;i<=num;i++)
cout<<m[i].num<<" "<<m[i].score<<endl;
return 0;
}