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;
}