題目描述
某小學(xué)最近得到了一筆贊助,打算拿出其中一部分為學(xué)習(xí)成績優(yōu)秀的前 5 5 5 名學(xué)生發(fā)獎學(xué)金。期末,每個學(xué)生都有 3 3 3 門課的成績:語文、數(shù)學(xué)、英語。先按總分從高到低排序,如果兩個同學(xué)總分相同,再按語文成績從高到低排序,如果兩個同學(xué)總分和語文成績都相同,那么規(guī)定學(xué)號小的同學(xué) 排在前面,這樣,每個學(xué)生的排序是唯一確定的。
任務(wù):先根據(jù)輸入的 3 3 3 門課的成績計算總分,然后按上述規(guī)則排序,最后按排名順序輸出前五名名學(xué)生的學(xué)號和總分。注意,在前 5 5 5 名同學(xué)中,每個人的獎學(xué)金都不相同,因此,你必須嚴(yán)格按上述規(guī)則排序。例如,在某個正確答案中,如果前兩行的輸出數(shù)據(jù)(每行輸出兩個數(shù):學(xué)號、總分) 是:
7
7
7
279
279
279
5
5
5
279
279
279
這兩行數(shù)據(jù)的含義是:總分最高的兩個同學(xué)的學(xué)號依次是 7 7 7 號、 5 5 5 號。這兩名同學(xué)的總分都是 279 279 279 (總分等于輸入的語文、數(shù)學(xué)、英語三科成績之和) ,但學(xué)號為 7 7 7 的學(xué)生語文成績更高一些。如果你的前兩名的輸出數(shù)據(jù)是:
5
5
5
279
279
279
7
7
7
279
279
279
則按輸出錯誤處理,不能得分。
輸入格式
共 n + 1 n+1 n+1行。
第 1 1 1 行為一個正整數(shù) n ( ≤ 300 ) n ( \le 300) n(≤300),表示該校參加評選的學(xué)生人數(shù)。
第 2 2 2 到 n + 1 n+1 n+1 行,每行有 3 3 3 個用空格隔開的數(shù)字,每個數(shù)字都在 0 0 0 到 100 100 100 之間。第 j j j 行的 3 3 3 個數(shù)字依次表示學(xué)號為 j ? 1 j-1 j?1 的學(xué)生的語文、數(shù)學(xué)、英語的成績。每個學(xué)生的學(xué)號按照輸入順序編號為 1 ~ n 1\sim n 1~n(恰好是輸入數(shù)據(jù)的行號減 1 1 1)。
所給的數(shù)據(jù)都是正確的,不必檢驗。
//感謝 黃小U飲品 修正輸入格式
輸出格式
共 5 5 5 行,每行是兩個用空格隔開的正整數(shù),依次表示前 5 5 5 名學(xué)生的學(xué)號和總分。
樣例 #1
樣例輸入 #1
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
樣例輸出 #1
6 265
4 264
3 258
2 244
1 237
樣例 #2
樣例輸入 #2
8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
樣例輸出 #2
8 265
2 264
6 264
1 258
5 258
1.題目分析
輸入學(xué)生個數(shù),再分別輸入每個學(xué)生的語數(shù)外的成績。
按照以下要求進行排序:
- 先按總分排序。
- 若總分相同,則按語文成績排序。
- 若語文成績再相同,則按學(xué)號從小到大排序。
排序后,依次輸出前五名的學(xué)號和總分。
這題一眼使用結(jié)構(gòu)體數(shù)組,封裝每個學(xué)生的信息再進行排序。
2.題目思路
先定義一個結(jié)構(gòu)體數(shù)組,封裝學(xué)生的學(xué)號,語數(shù)外成績以及總分。
編寫一個交換函數(shù):用于排序時交換結(jié)構(gòu)體數(shù)組上指定索引上元素的位置。文章來源:http://www.zghlxwxcb.cn/news/detail-691314.html
主函數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-691314.html
- 鍵入數(shù)據(jù):學(xué)生個數(shù),語數(shù)外成績,總分一邊計算一邊存入結(jié)構(gòu)體數(shù)組。
- 使用選擇排序 ,先按總分排,若相同,依次按語文成績排序,按學(xué)號排。值得一提的是,除了學(xué)號是升序外,其他全是降序。
- 最后輸出前五名(數(shù)組前5個元素)即可。
3.代碼實現(xiàn)
#include <iostream>
using namespace std;
//定義結(jié)構(gòu)體,封裝學(xué)生信息
typedef struct data {
//學(xué)號
int Id;
//語數(shù)外成績
int ch, ma, en;
//總分
int sum;
} Stu;
//交換結(jié)構(gòu)體數(shù)組上指定索引上元素的位置
void swap(Stu *stu, int i, int j) {
Stu temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
int main() {
int n;
cin >> n;
Stu stu[n];
//鍵入數(shù)據(jù)
for (int i = 0; i < n; ++i) {
cin >> stu[i].ch >> stu[i].ma >> stu[i].en;
stu[i].Id = i + 1;
//求和
stu[i].sum = stu[i].ch + stu[i].ma + stu[i].en;
}
//排序,總分,語文成績,學(xué)號
//選擇排序
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
//先按總分排
if (stu[i].sum < stu[j].sum) {
swap(stu, i, j);
} else if (stu[i].sum == stu[j].sum) {
//按語文成績排序
if (stu[i].ch < stu[j].ch) {
swap(stu, i, j);
} else if (stu[i].ch == stu[j].ch) {
//按學(xué)號排
if (stu[i].Id > stu[j].Id) {
swap(stu, i, j);
}
}
}
}
}
//輸出前五名
for (int i = 0; i < 5; ++i) {
cout << stu[i].Id << " " << stu[i].sum << endl;
}
return 0;
}
到了這里,關(guān)于P1093 [NOIP2007 普及組] 獎學(xué)金的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!