信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
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 提高组] 谁拿了最多奖学金的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1176:谁考了第k名
- 下一篇: 信息学奥赛一本通 1227:Ride t