为方便题意理解,先简单介绍一下ACM比赛的排名规则。
在ACM赛制中,排名的依据标准有两个,一是队伍的解题数,二是队伍解题耗费的时间。解题数为排名的主要依据,解出更多题目的队伍排名更高;而对于解题数相同的队伍,根据他们解题耗时进行排名,耗时短的队伍排名更高。
现给出某次ACM比赛的队伍最终成绩,即解题数和解题耗时,其中存在并列的队伍,也就是说解题数和解题耗时完全相同(这种情况正规比赛不会出现,本题是假设)。要求回答出排某一名次的队伍共存在多少并列。
输入
输入第一行包含两个整数n和k(1 ≤ k ≤ n ≤ 50),其中n表示队伍数,k表示需要查询并列的名次。
接下来是n行,表示n个队伍的成绩,每行包含两个整数p和t (1 ≤ p, t ≤ 50),p表示队伍解题数,t表示队伍解题耗时。
输出
输出一个整数,即排第k名的队伍存在的并列队伍总数。
输入样例1
7 2
4 10
4 10
4 10
3 20
2 1
2 1
1 10
输出样例1
3
输入样例2
5 4
3 1
3 1
5 3
3 1
3 1
输出样例2
4
提示
①所谓某队的并列队伍总数是包含这个队伍自身的。
②说明一下本题中“第k名”的含义:拿一个有序的数列举例,5 4 4 4 3 3,由于有多个“4”和“3”存在,所以对于“第2大的”或“第3大的”或“第4大的”的数字,都是4,“第5大的”和“第6大的”也都是3。题目中“第k名”的队伍也是同理。
思路:若所做题数和时间相同,做同样操作最后的数是相同的,得出的数据存到一个数组里边,,排序,而后判断第几名的个数为多少。
#include"stdio.h"
#include"algorithm"
#include"string.h"
using namespace std;
int main()
{
int n,k,a[105],x,y;
while(~scanf("%d %d",&n,&k))
{
memset(a,0,sizeof(a));
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
a[i]=x*50-y;
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
if(a[i]==a[n-k])
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}