# Greedy# Conditional Statement# Data Structure

b142 - NOIP2005 1.谁拿了最多奖学金

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算在給定的學生列表中,哪位學生獲得的獎學金總額最高,並輸出該學生的姓名、獎學金總額以及所有學生獎學金總額的和。獎學金的獲得條件有多種,包括學業成績、班級評議成績、是否為學生幹部、是否為西部省份學生以及發表論文數量。

解題思路

本題的核心思路是遍歷所有學生,根據獎學金的獲取條件,計算每位學生的獎學金總額。在計算過程中,使用一個變數記錄目前獎學金總額最高的學生及其獎學金總額。遍歷完所有學生後,輸出獎學金總額最高的學生的姓名和獎學金總額,以及所有學生的獎學金總額。由於題目要求輸出在輸入文件中出現最早的學生,因此在更新最高獎學金時,只需要比較獎學金總額是否更高即可,不需要考慮出現順序。

複雜度分析

  • 時間複雜度: 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 ;
}

Discussion