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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金

發布時間:2025/3/17 编程问答 35 豆豆

【題目鏈接】

ybt 1839:【05NOIP提高組】誰拿了最多獎學金
OpenJudge NOI 1.9 04:誰拿了最多獎學金
洛谷 P1051 [NOIP2005 提高組] 誰拿了最多獎學金

【題目考點】

1. 模擬

2. 求和

3. 求最值

【解題思路】

本題考查對稍微復雜的業務邏輯的模擬,需要答題者有良好的代碼組織能力,即每個變量的意義要明確,組織要清晰,添加合理的注釋,力求使自己寫的代碼自己要能看懂(不要覺得這是很容易的事情)。
本題可以用多個數組完成,也可以用結構體數組完成。
(推薦使用結構體。使用結構體的目的就是使代碼語意更明確。這一點十分重要,可以幫助你少出bug,或出bug后容易查bug,能幫你節省大量時間)

【題解代碼】

解法1:使用多個數組

#include<bits/stdc++.h> using namespace std; #define N 105 string name[N];//name[i]:第i人的姓名 int money[N];//money[i]:第i人獲得的獎學金 初值為0 int main() {int n, gStudy, gClass, paperNum, sum = 0, mxi = 1;//gStudy:學習成績 gClass:班級成績 paperNum:論文數量 char isLeader, isWest;//isLeader:是否是干部 isWest:是否來自西部 cin >> n;for(int i = 1; i <= n; ++i){cin >> name[i] >> gStudy >> gClass >> isLeader >> isWest >> paperNum;if(gStudy > 80 && paperNum >= 1)money[i] += 8000;if(gStudy > 85 && gClass > 80)money[i] += 4000;if(gStudy > 90)money[i] += 2000;if(gStudy > 85 && isWest == 'Y')money[i] += 1000;if(gClass > 80 && isLeader == 'Y')money[i] += 850;if(money[i] > money[mxi])//求最大值下標 mxi:獲得最多獎學金的人的編號。如有相同最大值,只會取先出現的最大值的下標 mxi = i;sum += money[i];//sum:所有人獎學金總和 }cout << name[mxi] << endl << money[mxi] << endl << sum; return 0; }

解法2:使用結構體

#include<bits/stdc++.h> using namespace std; #define N 105 struct Student {string name;int money;Student(){}//空構造函數,如果沒有空構造函數,就無法聲明Student對象數組 Student(string _name, int gStudy, int gClass, char isLeader, char isWest, int paperNum) {//通過各種指標構造Student對象name = _name;money = 0;if(gStudy > 80 && paperNum >= 1)money += 8000;if(gStudy > 85 && gClass > 80)money += 4000;if(gStudy > 90)money += 2000;if(gStudy > 85 && isWest == 'Y')money += 1000;if(gClass > 80 && isLeader == 'Y')money += 850;} }; Student stu[N];//stu[i]:學生i int main() {string name;int n, gStudy, gClass, paperNum, sum = 0, mxi = 1;//gStudy:學習成績 gClass:班級成績 paperNum:論文數量 char isLeader, isWest;//isLeader:是否是干部 isWest:是否來自西部 cin >> n;for(int i = 1; i <= n; ++i){cin >> name >> gStudy >> gClass >> isLeader >> isWest >> paperNum;stu[i] = Student(name, gStudy, gClass, isLeader, isWest, paperNum);//生成對象賦值給stu[i] if(stu[i].money > stu[mxi].money)//求最大值下標 mxi:獲得最多獎學金的人的編號。如有相同最大值,只會取先出現的最大值的下標 mxi = i;sum += stu[i].money;//sum:所有人獎學金總和 }cout << stu[mxi].name << endl << stu[mxi].money << endl << sum; return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金的全部內容,希望文章能夠幫你解決所遇到的問題。

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