1015. 德才论


题意:给出n个学生的准考证号、德分、才分以及及格线L、优秀线H,然后对这n个考生进行分类

1 如果德分和才分有一个低于L,则不及格,即第五类,且设下面4类均及格。

2 如果德分和才分均不低于H,则为第一类。

3 如果德分不低于H,才分低于H,则为第二类。

4 如果德分和才分均低于H但德分不低于才分,则为第三类。

5 剩余为第四类

对这n个考生按下面的规则排序:

1 先按类别从小到大排序

2 类别相同的 按总分从大到小排序。

3 总分相同的 按德分从大到小排序。

4 德分相同的 按准考证号从小到大排序。

最后输出所有及格生的信息,顺序为排完序后的顺序。


思路:

结构体存储学生信息。准考证号、德分、才分、总分以及类别。

对读入的学生进行分类,同时计算总分 及格人数。

使用sort排序 bmp函数按题意写。

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
struct Student{
	char id[10];//准考证号
	int de,cai,sum;//德分,才分以及总分
	int flag; 
}stu[100010]; 

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.de!=b.de) return a.de >b.de;
	else return strcmp(a.id,b.id)<0;
}

int main(){
	int n,L,H;
	scanf("%d %d %d",&n,&L,&H);
	int m=n;//m及格人数
	for(int i=0;i<n;i++){
		scanf("%s%d%d",stu[i].id,&stu[i].de,&stu[i].cai);
		stu[i].sum = stu[i].de+stu[i].cai;
		if(stu[i].de<L||stu[i].cai<L){//先处理不及格的,设为第五类 
			stu[i].flag=5;
			m--;//及格人数减1 
		}
		else if(stu[i].de>=H&&stu[i].cai>=H) stu[i].flag=1;
		else if(stu[i].de>=H&&stu[i].cai<=H) stu[i].flag=2;
		else if(stu[i].de>=stu[i].cai) stu[i].flag=3;
		else stu[i].flag=4;
	} 
	sort(stu,stu+n,cmp);
	printf("%d\n",m);
	for(int i=0;i<m;i++){
		printf("%s %d %d\n",stu[i].id,stu[i].de,stu[i].cai);
		
	}
	return 0;
	
}

猜你喜欢

转载自blog.csdn.net/pihe7623/article/details/80051952
今日推荐