题解 P1068 【分数线划定】

· · 题解

看着题解没有人用结构体,其实结构体都简单的,所以决定第二次发题解,大佬勿喷。。。。。。。。。。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct student
{
    int number;
    int point;
}a[100001];
bool cmp(student a,student b)
{
    if(a.point==b.point) return a.number<b.number;
    else
    return a.point>b.point;
}//对结构体进行排序的方法
int main()
{
    int m,n,k;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d %d",&a[i].number,&a[i].point);
    k=floor(float(m)*1.5);
    sort(a+1,a+n+1,cmp);
    //for(int i=1;i<=n;i++)
    //printf("%d %d\n",a[i].point,a[i].number);
    //printf("%d",k);
    int z=k;int j=1;int point;int o;
    int sum=0;
    while(z>0)
    {
        point=a[j].point;
        //printf("%d %d\n",a[j].number,a[j].point);
        j++;
        sum++;
        z--;
        if(z==0)
        {
            o=point;
        }
        while(a[j].point==point)
        {
            //printf("%d %d\n",a[j].number,a[j].point);
            j++;
            sum++;
            z--;
            if(z==0)
            o=point;
        }
    }//求出分数线和实际人数
    printf("%d %d\n",o,sum);
    z=k;j=1;
    while(z>0)
    {
        point=a[j].point;
        printf("%d %d\n",a[j].number,a[j].point);
        j++;
        z--;
        while(a[j].point==point)
        {
            printf("%d %d\n",a[j].number,a[j].point);
            j++;
            z--;
        }
    }//将人和分数都输出来

    return 0;
}