算法--德才论(解析)

ps:这两天在牛客上练习pat系统,做了一部分的题,有一些是经过一些思考的,不想把这些思想丢掉,希望对大家有一定帮助。

具体的问题和输入输出格式,请点击☛德才论题目

下面写出的分析过程和最终代码:

一,题意

    德才兼备 == 圣人

    德大于才 == 君子

    德才皆无 == 愚人

    才大于德 == 小人

二,输入输出

    输入:总数    最低分数    考虑录取条件(德从高到低)

    输出:过线总人数\n    分行列出人数

三,思路

    1,学生的结构体

        struct{

            int 准考证号

            int  德分;

            int 才分;

            int 总分; 

        }stu;

    分类的存放位置:stu[100]  A,B,C,D

    2,排序方法

    

四,代码

#include "stdio.h"

typedef struct{
	int number;
	int virtue;
	int skill;
	int sum;
	
}student;

void  swap(student *a,student *b){
		student temp;
		temp = *a;
		*a = *b;
		*b = temp;
}

student sort(student *stu,int n){
	int i=0,j=0,flag=0;
	for(i=0;i<n-1;i++){
		flag = 0;
		for(j=0;j<n-1-i;j++){
			if(stu[j].sum < stu[j+1].sum){
				swap(&stu[j],&stu[j+1]);
			}else if(stu[j].sum == stu[j+1].sum){
				if(stu[j].virtue < stu[j+1].virtue){
					swap(&stu[j],&stu[j+1]);
				}else if(stu[j].virtue == stu[j+1].virtue){
					if(stu[j].number > stu[j+1].number)
						swap(&stu[j],&stu[j+1]);
				}
			}
		}
	}
	return *stu;
}
void display(student *stu,int n){
	int i=0;
	for(i=0;i<n;i++){
		printf("%08d %d %d\n",stu[i].number,stu[i].virtue,stu[i].skill);
	}
}
int main(){
	int number=0,l=0,h=0,m=0;
	//记录每种分类的数目 
	int na=0,nb=0,nc=0,nd=0;
	int i=0;
	scanf("%d %d %d",&number,&l,&h);
	student stu[number],a[number],b[number],c[number],d[number];
	//输入全部的学生数据 
	for(i = 0;i < number; i++){
		scanf("%d %08d %d",&stu[i].number,&stu[i].virtue,&stu[i].skill);
		stu[i].sum = stu[i].skill + stu[i].virtue; 
	}
	for(i = 0;i < number; i++){
		//圣人判断条件 
		if(stu[i].skill >= h && stu[i].virtue >=h){
			a[na] = stu[i];
			na++; 
		}
		//君子判断条件 
		if(stu[i].skill < h && stu[i].skill >= l && stu[i].virtue >=h){
			b[nb] = stu[i];
			nb++; 
		}
		//愚人判断条件 
		if(stu[i].skill < h && stu[i].virtue <h &&stu[i].skill >= l
		 && stu[i].virtue >= l&&stu[i].virtue >= stu[i].skill){
			c[nc] = stu[i];
			nc++; 
		}
		//小人判断条件 
		if(stu[i].skill >= l && stu[i].virtue >= l && stu[i].virtue < stu[i].skill&&stu[i].virtue<h){
			d[nd] = stu[i];
			nd++; 
		}
	}
	m = na+nb+nc+nd;
	printf("%d\n",m);
	//排序
	sort(a,na);
	sort(b,nb);
	sort(c,nc);
	sort(d,nd); 
	//输出 
	display(a,na);
	display(b,nb);
	display(c,nc);
	display(d,nd);

	return 0;
}


    


猜你喜欢

转载自blog.csdn.net/zzzzlei123123123/article/details/79652555