日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金

發布時間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

ybt 1179:獎學金
ybt 1938:【07NOIP普及組】獎學金
OpenJudge NOI 1.10 04:獎學金
洛谷 P1093 [NOIP2007 普及組] 獎學金

【題目考點】

1. 排序

【君義精講】排序算法

2. 多關鍵字排序

方法1:將多關鍵字的排序條件整合為單一排序條件
方法2:使用穩定的排序算法進行多趟排序

【解題思路】

設結構體表示學生信息,保存人名、學號及各科成績

解法1:將多關鍵字的排序條件整合為單一排序條件

可以將該排序條件設為函數:函數傳入兩個學生的結構體對象a與b
如果a與b的總成績及語文成績相同,學號小的排在前面。
如果a與b的總成績相同但語文成績不同,語文成績高的排在前面。
如果a與b的總成績不同,總成績高的排在前面。
當然,也可以將整個條件寫為一個表達式。
排序方法可以任意選擇。

解法2:使用穩定的排序算法進行多趟排序

先按學號從小到大排序
再按語文成績從高到低排序
再按總成績從高到低排序。
只能選擇穩定的排序方法。

【題解代碼】

解法1:將多關鍵字的排序條件整合為單一排序條件

  • 函數寫法1 + 插入排序
#include<bits/stdc++.h> using namespace std; struct Stu {int id, Chinese, score;//id:編號 Chinese:語文成績 score:總成績 }; bool isPrior(Stu d1, Stu d2)//比較函數 判斷d1是否應該在d2前面 {if(d1.score > d2.score)//比較總分 return true;else if(d1.score < d2.score)return false;else//總分數相等 {if(d1.Chinese > d2.Chinese)//比較語文成績 return true;else if(d1.Chinese < d2.Chinese)return false;else//語文成績相等 {if(d1.id < d2.id)//比較學號 return true;elsereturn false;} } } int main() {int n, a, b, c;//n:人數 a,b,c:語文,數學,英語成績cin >> n;Stu d[305]; for(int i = 1; i <= n; ++i){cin >> a >> b >> c;d[i].id = i;d[i].Chinese = a;d[i].score = a+b+c;}for(int i = 2; i <= n; ++i)//插入排序 {for(int j = i; j > 1; --j){if(isPrior(d[j], d[j-1]))swap(d[j], d[j-1]);elsebreak;}}for(int i = 1; i <= 5; ++i)cout << d[i].id << ' ' << d[i].score << endl;return 0; }
  • 函數寫法2 + STL sort函數排序
#include<bits/stdc++.h> using namespace std; struct Stu {int id, Chinese, score;//id:編號 Chinese:語文成績 score:總成績 }; bool cmp(Stu d1, Stu d2)//比較函數 判斷d1是否應該在d2前面 {if(d1.score == d2.score && d1.Chinese == d2.Chinese)return d1.id < d2.id;else if(d1.score == d2.score)return d1.Chinese > d2.Chinese;elsereturn d1.score > d2.score; } int main() {int n, a, b, c;//n:人數 a,b,c:語文,數學,英語成績cin >> n;Stu d[305]; for(int i = 1; i <= n; ++i){cin >> a >> b >> c;d[i].id = i;d[i].Chinese = a;d[i].score = a+b+c;}sort(d+1, d+1+n, cmp); for(int i = 1; i <= 5; ++i)cout << d[i].id << ' ' << d[i].score << endl;return 0; }
  • 寫成表達式 + 冒泡排序
#include<bits/stdc++.h> using namespace std; struct Stu {int id, Chinese, score;//id:編號 Chinese:語文成績 score:總成績 }; bool isPrior(Stu d1, Stu d2)//比較函數 判斷d1是否應該在d2前面 {return d1.score > d2.score || d1.score == d2.score && d1.Chinese > d2.Chinese ||d1.score == d2.score && d1.Chinese == d2.Chinese && d1.id < d2.id; } int main() {int n, a, b, c;//n:人數 a,b,c:語文,數學,英語成績cin >> n;Stu d[305]; for(int i = 1; i <= n; ++i){cin >> a >> b >> c;d[i].id = i;d[i].Chinese = a;d[i].score = a+b+c;}for(int i = 1; i <= n-1; ++i)//冒泡排序 for(int j = 1; j <= n-i; ++j)if(isPrior(d[j+1], d[j]))//如果d[j+1]應該在d[j]前面 swap(d[j], d[j+1]);for(int i = 1; i <= 5; ++i)cout << d[i].id << ' ' << d[i].score << endl;return 0; }

解法2:使用穩定的排序算法進行多趟排序

#include<bits/stdc++.h> using namespace std; struct Stu {int id, Chinese, score;//id:編號 Chinese:語文成績 score:總成績 }; bool cmp1(Stu d1, Stu d2) {return d1.id < d2.id; } bool cmp2(Stu d1, Stu d2) {return d1.Chinese > d2.Chinese; } bool cmp3(Stu d1, Stu d2) {return d1.score > d2.score; } int main() {int n, a, b, c;//n:人數 a,b,c:語文,數學,英語成績cin >> n;Stu d[305]; for(int i = 1; i <= n; ++i){cin >> a >> b >> c;d[i].id = i;d[i].Chinese = a;d[i].score = a+b+c;}stable_sort(d+1, d+1+n, cmp1);//學號從小到大stable_sort(d+1, d+1+n, cmp2);//語文從大到小stable_sort(d+1, d+1+n, cmp3);//總分從大到小 for(int i = 1; i <= 5; ++i)cout << d[i].id << ' ' << d[i].score << endl;return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。