前言

传送门

正文

思路:

题意:
给出n个考生的id号,德分,才分 ,及格线L,优秀线H,对这n个考生分类
第五类:考生的德分或者才分低于L 
第一类:考生的德分,才分均不低于H
第二类:考生的德分不低于H,但才分低于H 
第三类:考生的德分和才分低于H,但德分不低于才分
第四类:剩下的就是第四类

排序规则:
首先按照类别从小到大排序
类别相同的按照总分(德分+才分)降序排序
总分相同的则按照德分降序排序 
德分相同的则按照id号升序排序 

构造考生结构体,从题意来看,结构体中应该包含的信息有id,德分,才分,总分,类别。 
这里注意方法一直接使用cin和cout会导致超时,因此需要将输入输出改为scanf和printf,
同时在cmp排序规则中使用strcmp来比较id号的大小

参考题解
方法一(超时)

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
给出n个考生的id号,德分,才分 ,及格线L,优秀线H,对这n个考生分类
第五类:考生的德分或者才分低于L 
第一类:考生的德分,才分均不低于H
第二类:考生的德分不低于H,但才分低于H 
第三类:考生的德分和才分低于H,但德分不低于才分
第四类:剩下的就是第四类

排序规则:
首先按照类别从小到大排序
类别相同的按照总分(德分+才分)降序排序
总分相同的则按照德分降序排序 
德分相同的则按照id号升序排序 

构造考生结构体,从题意来看,结构体中
应该包含的信息有id,德分,才分,总分,
类别。 
*/
struct student{
	string id;
	int virtue,talent,sum;
	int flag; 
}stu[100001]; 
//排序规则 
bool cmp(student a,student b){
	if(a.flag!=b.flag)return a.flag<b.flag;
	else if(a.sum!=b.sum)return a.sum>b.sum;
	else if(a.virtue!=b.virtue)return a.virtue>b.virtue;
	else return a.id<b.id;
} 
int main(){
	int n,L,H,count;
	cin>>n>>L>>H;
	count=n;
	getchar();//读取缓冲区中的换行符,以免影响下一次读入id号 
	for(int i=0;i<n;i++){
		cin>>stu[i].id>>stu[i].virtue>>stu[i].talent;
		stu[i].sum=stu[i].virtue+stu[i].talent;
		if(stu[i].virtue<L||stu[i].talent<L){
			stu[i].flag=5;
			count--;//总共及格人数 
		} 
		else if(stu[i].virtue>=H&&stu[i].talent>=H) stu[i].flag=1;
		else if(stu[i].virtue>=H&&stu[i].talent<H) stu[i].flag=2;
		else if(stu[i].virtue<H&&stu[i].talent<H&&stu[i].virtue>=stu[i].talent)stu[i].flag=3; 
		else stu[i].flag=4;
		getchar();//读取缓冲区中的换行符,以免影响下一次读入id号 
	}
	cout<<count<<endl;
	sort(stu,stu+n,cmp);//排序
	for(int i=0;i<count;i++){
		cout<<stu[i].id<<" "<<stu[i].virtue<<" "<<stu[i].talent<<endl; 
	} 
	return 0;
}

法二(由于法一会超时,因此将输入和输出改为scanf和printf,为了便于printf输出,将string类型改为char数组类型)

#include<iostream>
#include<string>
#include<algorithm>
#include<cstring> 
using namespace std;
/*
给出n个考生的id号,德分,才分 ,及格线L,优秀线H,对这n个考生分类
第五类:考生的德分或者才分低于L 
第一类:考生的德分,才分均不低于H
第二类:考生的德分不低于H,但才分低于H 
第三类:考生的德分和才分低于H,但德分不低于才分
第四类:剩下的就是第四类

排序规则:
首先按照类别从小到大排序
类别相同的按照总分(德分+才分)降序排序
总分相同的则按照德分降序排序 
德分相同的则按照id号升序排序 

构造考生结构体,从题意来看,结构体中
应该包含的信息有id,德分,才分,总分,
类别。 
*/

struct student{
	char id[10];
	int virtue,talent,sum;
	int flag; 
}stu[100001]; 
//排序规则 
bool cmp(student a,student b){
	if(a.flag!=b.flag)return a.flag<b.flag;
	else if(a.sum!=b.sum)return a.sum>b.sum;
	else if(a.virtue!=b.virtue)return a.virtue>b.virtue;
	else return strcmp(a.id,b.id)<0;
} 
int main(){
	int n,L,H,count;
	//cin>>n>>L>>H;
	scanf("%d %d %d",&n,&L,&H);
	count=n;
	//getchar();//读取缓冲区中的换行符,以免影响下一次读入id号 
	for(int i=0;i<n;i++){
		//cin>>stu[i].id>>stu[i].virtue>>stu[i].talent;
		scanf("%s %d %d",stu[i].id,&stu[i].virtue,&stu[i].talent); 
		stu[i].sum=stu[i].virtue+stu[i].talent;
		if(stu[i].virtue<L||stu[i].talent<L){
			stu[i].flag=5;
			count--;//总共及格人数 
		} 
		else if(stu[i].virtue>=H&&stu[i].talent>=H) stu[i].flag=1;
		else if(stu[i].virtue>=H&&stu[i].talent<H) stu[i].flag=2;
		else if(stu[i].virtue<H&&stu[i].talent<H&&stu[i].virtue>=stu[i].talent)stu[i].flag=3; 
		else stu[i].flag=4;
		//getchar();//读取缓冲区中的换行符,以免影响下一次读入id号 
	}
	//cout<<count<<endl;
	printf("%d\n",count);
	sort(stu,stu+n,cmp);
	for(int i=0;i<count;i++){
		//cout<<stu[i].id<<" "<<stu[i].virtue<<" "<<stu[i].talent<<endl; 
		//printf只能输出C语言内置的数据,而string不是内置的,只是一个扩展的类, 因此不能用printf输出string 
		printf("%s %d %d\n",stu[i].id,stu[i].virtue,stu[i].talent);
	} 
	return 0;
}