PAT A1062 Talent and Virtue

前言

傳送門

正文

在這裏插入圖片描述

思路:

題意:
給出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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章