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