申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年10月26日 星期三

NOIP2005提高組 誰拿了最多獎學金 scholar 解題報告

【問題描述】
某校的慣例是在每學期的期末考試之後發放獎學金。發放的獎學金共有五種,獲取的條件各自不同:
1) 院士獎學金,每人8000元,期末平均成績高於80分(>80),並且在本學期內發表1篇或1篇以上論文的學生均可獲得;
2) 五四獎學金,每人4000元,期末平均成績高於85分(>85),並且班級評議成績高於80分(>80)的學生均可獲得;
3) 成績優秀獎,每人2000元,期末平均成績高於90分(>90)的學生均可獲得;
4) 西部獎學金,每人1000元,期末平均成績高於85分(>85)的西部省份學生均可獲得;
5) 班級貢獻獎,每人850元,班級評議成績高於80分(>80)的學生幹部均可獲得;
只要符合條件就可以得獎,每項獎學金的獲獎人數沒有限制,每名學生也可以同時獲得多項獎學金。例如姚林的期末平均成績是87分,班級評議成績82分,同時他還是一位學生幹部,那麼他可以同時獲得五四獎學金和班級貢獻獎,獎金總數是4850元。
現在給出若干學生的相關數據,請計算哪些同學獲得的獎金總數最高(假設總有同學能滿足獲得獎學金的條件)。

【輸入文件】
輸入文件scholar.in的第一行是一個整數N(1 <= N <= 100),表示學生的總數。接下來的N行每行是一位學生的數據,從左向右依次是姓名,期末平均成績,班級評議成績,是否是學生幹部,是否是西部省份學生,以及發表的論文數。姓名是由大小寫英文字母組成的長度不超過20的字符串(不含空格);期末平均成績和班級評議成績都是0到100之間的整數(包括0和100);是否是學生幹部和是否是西部省份學生分別用一個字符表示,Y表示是,N表示不是;發表的論文數是0到10的整數(包括0和10)。每兩個相鄰數據項之間用一個空格分隔。

【輸出文件】
輸出文件scholar.out包括三行,第一行是獲得最多獎金的學生的姓名,第二行是這名學生獲得的獎金總數。如果有兩位或兩位以上的學生獲得的獎金最多,輸出他們之中在輸入文件中出現最早的學生的姓名。第三行是這N個學生獲得的獎學金的總數。

【樣例輸入】
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

【樣例輸出】
ChenRuiyi
9000
28700

【分析】
這幾乎是NOIP中最水的題了,只要學過編程的人都會做,只要看清題目,就能一次AC。

【我的代碼】


#include <cstring>
#include <fstream>
using namespace std;
ifstream fin("scholar.in");
ofstream fout("scholar.out");
class Student
{
public:
string name;//學生姓名
unsigned int final;//期末成績
unsigned int Class;//班級評議
bool cadre; //是否幹部
bool west; //是否西部學生
short int lunwen;//論文數量
long long total;
Student()
{
cadre=false;
west=false;
total=0;
}
}N[101];
int n;

int maxn=0;
int maxx=0;
long long s=0;

void init()
{
char chr;
fin>>n;
for (int i=1;i<=n;i++)
{
fin>>N[i].name>>N[i].final>>N[i].Class;
fin>>chr;
if (chr=='Y') N[i].cadre=true;
fin>>chr;
if (chr=='Y') N[i].west=true;
fin>>N[i].lunwen;
}
return;
}

void compute(int num)
{
if (N[num].final>80 && N[num].lunwen>=1) N[num].total+=8000;
if (N[num].final>85 && N[num].Class>80) N[num].total+=4000;
if (N[num].final>90) N[num].total+=2000;
if (N[num].final>85 && N[num].west) N[num].total+=1000;
if (N[num].Class>80 && N[num].cadre) N[num].total+=850;
if (N[num].total>maxn) 
{
maxn=N[num].total;
maxx=num;
}
s+=N[num].total;
}

int main()
{
init();
for (int i=1;i<=n;i++)
compute(i);
fout<<N[maxx].name<<endl<<N[maxx].total<<endl<<s<<endl;
return 0;
}
正在连接评测机...
已连接到评测机
GRID1
名称Flitty
系统版本1.00
备注COGS 1号评测机 Flitty
正在编译...
编译成功
测试点结果得分运行时间内存使用退出代码
1正确100.001 s270 KB0
2正确100.000 s270 KB0
3正确100.000 s270 KB0
4正确100.000 s270 KB0
5正确100.000 s270 KB0
6正确100.000 s270 KB0
7正确100.001 s270 KB0
8正确100.000 s270 KB0
9正确100.000 s270 KB0
10正确100.001 s270 KB0
运行完成
运行时间 0.005 s
平均内存使用 270 KB
测试点通过状况 AAAAAAAAAA
得分:100
恭喜你通过了全部测试点!

沒有留言:

張貼留言