分数线划定(o(n^2)排序算法)

Description
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。
面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第[m×150%](向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
Input
第一行,两个整数n,m,中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。输入数据保证[m×150%]≤n。
第二行到第 n+1行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k和该选手的笔试成绩s。数据保证选手的报名号各不相同。
Output
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
Sample Input 1
6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
Sample Output 1
88 5
1005 95
2390 95
1000 90
1001 88
3239 88
Hint
[m×150%]=[3×150%]=[4.5]=4。保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88的选手都可以进入面试,故最终有5个人进入面试。
5≤n≤5000,3≤m≤n,1000≤k≤9999,1≤s≤100
Time Limit
1000MS
Memory Limit
256MB

数据上限是5000,因为5000*5000=2.5 * 10^ 7 < 10^8,故可以用o(n ^2 )的排序算法解决,我选冒泡排序,且从后往前冒泡。

#include<stdio.h>
#include<algorithm>
using namespace std;

int n,m;

struct player
{
    int k;
    int s;
}p[5000];

bool check(int x)//排序规则,true表示需要换位置
{//枚举出所有要换位的情况,剩下的一定不需要换位
    if(p[x].s>p[x-1].s) return true;
    if(p[x].s==p[x-1].s && p[x].k<p[x-1].k)
       return true;
    return false;
}

int main()
{
    scanf("%d%d",&n,&m);
    m*=1.5;

    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&p[i].k,&p[i].s);
    }
    //排序
    for(int i=0;i<n-1;i++)
    {
        for(int j=n-1;j>i;j--)
           if(check(j)){
               swap(p[j],p[j-1]);
           }
    }//调整面试人数
    while(p[m-1].s==p[m].s) ++m;

    printf("%d %d\n",p[m-1].s,m);
    for(int i=0;i<m;i++)
    {
        printf("%d %d\n",p[i].k,p[i].s);
    }
    return 0;
}
上一篇:Leetcode 88:合并两个有序数组


下一篇:小和问题与荷兰国旗问题