题解 P1068 【分数线划定】

· · 题解

比较简单的一道题吧,首先就是输入了。主要思路就是先将分数排序(同时将报名号排序),然后用floor函数向下取整,a储存分数线,最后循环用b累计并输出。

其实可以直接定义一个结构体,用sort排序方便一些,不过冒泡排序并不会超时,为了方便看懂,所以就没有改。


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n,m,num[10000],sco[10000],a,b=0,i,j;
    cin>>n>>m;
    for(i=0;i<n;i++)
        cin>>num[i]>>sco[i];
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
        {
            if(sco[i]<sco[j])
            {
                swap(sco[i],sco[j]);
                swap(num[i],num[j]);
            }
            else if(sco[i]==sco[j])
            {
                if(num[j]<num[i])
                    swap(num[j],num[i]);
            }
        }
    m=floor(1.5*m);
    a=sco[m-1];
    for(i=0;i<n;i++)
    {
        if(sco[i]>=a)
            b++;
        else
            break;
    }
    cout<<a<<" "<<b<<endl;
    for(i=0;i<b;i++)
        cout<<num[i]<<" "<<sco[i]<<endl;
    return 0;
}