b142 - NOIP2005 1.谁拿了最多奖学金
題目描述
題目要求計算在給定的學生列表中,哪位學生獲得的獎學金總額最高,並輸出該學生的姓名、獎學金總額以及所有學生獎學金總額的和。獎學金的獲得條件有多種,包括學業成績、班級評議成績、是否為學生幹部、是否為西部省份學生以及發表論文數量。
解題思路
本題的核心思路是遍歷所有學生,根據獎學金的獲取條件,計算每位學生的獎學金總額。在計算過程中,使用一個變數記錄目前獎學金總額最高的學生及其獎學金總額。遍歷完所有學生後,輸出獎學金總額最高的學生的姓名和獎學金總額,以及所有學生的獎學金總額。由於題目要求輸出在輸入文件中出現最早的學生,因此在更新最高獎學金時,只需要比較獎學金總額是否更高即可,不需要考慮出現順序。
複雜度分析
- 時間複雜度: O(n),其中 n 是學生的數量。需要遍歷所有學生一次來計算獎學金總額。
- 空間複雜度: O(n),用於儲存學生的資訊。
程式碼
#include <iostream>
using namespace std;
struct st{
string name;
int a,b;
char c,d;
int e,total=0;
};
int main(){
int n,ans=0,sum=0;
cin >> n;
string aa;
st p[n];
for(int i=0;i<n;++i){
cin >> p[i].name >> p[i].a >> p[i].b >> p[i].c >> p[i].d >> p[i].e;
if(p[i].a>80&&p[i].e)
p[i].total+=8000;
if(p[i].a>85&&p[i].b>80)
p[i].total+=4000;
if(p[i].a>90)
p[i].total+=2000;
if(p[i].a>85&&p[i].d=='Y')
p[i].total+=1000;
if(p[i].b>80&&p[i].c=='Y')
p[i].total+=850;
if(p[i].total>ans){
ans=p[i].total;
aa=p[i].name;
}
sum+=p[i].total;
}
cout << aa << "\n" << ans << "\n" << sum ;
}