思路:
1、给出n个学生的准考证号,德分,才分,及格线L和优先线H
2、根据题目要求进行排序划分即可
注意:
1、由于数据量比较大,建议使用scanf和printf
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct Node //学生结构体
{
char id[20];
int t_grade,v_grade,flag,total;
}n[100005];
bool cmp(Node n1,Node n2)
{
if(n1.flag != n2.flag) //先按类别排序
return n1.flag < n2.flag;
if(n1.total != n2.total) //按总分降序
return n1.total > n2.total;
if(n1.v_grade != n2.v_grade)//按德分降序
return n1.v_grade > n2.v_grade;
if(strcmp(n1.id,n2.id) != 0)//按ID圣墟
return strcmp(n1.id,n2.id) < 0;
}
int main()
{
int k,l,h;
scanf("%d%d%d",&k,&l,&h);
int sum = k;
for(int i=0,j=0;i<k;i++)
{
scanf("%s%d%d",&n[j].id,&n[j].v_grade,&n[j].t_grade);
if(n[j].t_grade < l || n[j].v_grade < l)//把不及格的学生剔除排序之外
{
sum--;
continue;
}
if(n[j].t_grade >= h && n[j].v_grade >= h) //给学生划分4个类别
n[j].flag = 1;
else if(n[j].t_grade < h && n[j].v_grade >= h)
n[j].flag = 2;
else if(n[j].t_grade <= n[j].v_grade)
n[j].flag = 3;
else
n[j].flag = 4;
n[j].total = n[j].t_grade + n[j].v_grade;
j++;
}
sort(n,n+sum,cmp);
printf("%d\n",sum);
for(int i=0;i<sum;i++)
{
printf("%s %d %d\n",n[i].id,n[i].v_grade,n[i].t_grade);
}
return 0;
}