传送门
思路:
题意: 给出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; }