解题思路
划定分数线的前提是数据的存储方式要有序,本题的“有序”有两个层次,首先是按照得分,得分高在前;另外是在得分相同的情况下,报名号小的在前;用结构体数组来存储数据,自己写 函数,判断的优先级用一个 语句来限制。
比较的部分结束之后是对输出的讨论,从样例可以知道,如果刚好在进面试的分数上有多个志愿者分数相同,那么就会“扩招”,首先计算出计划招生人数,对应的会找到进面试的分数线,低于分数线的一定不会进入面试,否则的话要在计划招生人数的基础上++,给出实际招生人数,之后按照实际招生人数控制输出即可。
写的时候卡了两个地方:一是排了两次序,一次按报名号一次按得分,后来卡了之后发现可以综合到一个排序函数按照条件的优先级进行判断;后面一个地方是在判重分的地方,写错了标号,但是一直没看出来......果然简单的问题反而更容易轻视细节。
通过代码
#include<bits/stdc++.h>
using namespace std;
struct ty
{
int k, s;
}a[5010];
bool comp(ty x,ty y)
{
if (x.s != y.s) return x.s > y.s;
return x.k < y.k;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d %d", &a[i].k, &a[i].s);
sort (a+1, a+1+n, comp);
int count = m + m / 2;
for (int i = m + m / 2 + 1; i <= n; i++)
{
if(a[i].s == a[count].s)
{
count ++;
}
}
cout << a[m + m / 2].s << " " << count << endl;
for (int i = 1; i <= count; i++)
{
cout << a[i].k << " " << a[i].s << endl;
}
return 0;
}