1. 程式人生 > >PAT乙級1004(方法+程式碼)

PAT乙級1004(方法+程式碼)

1004 成績排名 (20 分)

讀入 n(>0)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。

輸入格式:

每個測試輸入包含 1 個測試用例,格式為

第 1 行:正整數 n
第 2 行:第 1 個學生的姓名 學號 成績
第 3 行:第 2 個學生的姓名 學號 成績
… … …
第 n+1 行:第 n 個學生的姓名 學號 成績
其中姓名和學號均為不超過 10 個字元的字串,成績為 0 到 100 之間的一個整數,這裡保證在一組測試用例中沒有兩個學生的成績是相同的。

輸出格式:

對每個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字串間有 1 空格。

輸入樣例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

輸出樣例:

Mike CS991301
Joe Math990112

解題思路(2種):(第一種實用,第二種簡單粗暴)

C++版

第一種:由於姓名、學號和分數是屬於同一名學生的資訊,因此可以使用結構體變數進行儲存學生資訊,儲存完所有學生的資訊後只用按學生的分數進行相應的排序便會輕易找到得最高分和得最低分的同學。

#include<iostream>
#include<stdlib.h>
#include<string>
#include<vector>
#include<algorithm> using namespace std; struct node { string name,id; int score; }; int cmp(struct node a,struct node b) { return a.score>b.score; } int main() { int n; cin>>n; vector<node> student;//只需要生成,不需要指定大小,因為下面有push_back node temp; for(int i = 0; i < n; i++ ) {
cin>>temp.name>>temp.id>>temp.score; student.push_back(temp); } sort(student.begin(),student.end(),cmp); cout<<student[0].name<<' '<<student[0].id<<endl;//呼叫時要按類似於讀取陣列內容的方式讀取 cout<<student[n-1].name<<' '<<student[n-1].id; system("pause"); return 0; }

第二種:簡單粗暴,直接定義一些儲存最高分和最低分學生資訊的變數,然後直接用找最大值和最小值的遍歷方法去尋找,找到的同時直接給上面所定義的變數進行賦值,最後讀取出來即可。

#include<iostream>
#include<stdlib.h>
#include<string>

using namespace std;

int main()
{
	string name,code,man,mac,min,mic;
	int n = 0,grade = 0,brige1 = 0,brige2 = 101;
	cin>>n;
	for(int i = 0; i < n; i++ )
	{
		cin>>name>>code>>grade;
		if(brige1<grade)
		{
			brige1 = grade;
			man = name;
			mac = code;
		}
		if(brige2>grade)
		{
			brige2 = grade;
			min = name;
			mic = code;
		}
	}
	cout<<man<<' '<<mac<<'\n';
	cout<<min<<' '<<mic<<'\n';
//	system("pause");
	return 0;
}