前言
正文
思路:
题意:
给出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;
}