专栏文章

题解:P1051 [NOIP 2005 提高组] 谁拿了最多奖学金

P1051题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq9w9f5
此快照首次捕获于
2025/12/04 01:20
3 个月前
此快照最后确认于
2025/12/04 01:20
3 个月前
查看原文

P1051 [NOIP 2005 提高组] 谁拿了最多奖学金

看到奖学金就有一种莫名其妙的冲动······

进入正题

本题就是给定信息问满不满足那几种条件。模拟水题
此题最大的考点就是输入输出。所以,我们可以创建一个结构体数组,存储每一个人的奖学金数量,再进行数组排序,进行输出即可。
你以为这就结束啦?正当我高高兴兴的写下代码时:
CPP
bool cmp(node a,node b)
{
	return a.g>b.g;
}
         .
         .
         .
         .
         .

  cout<<s[1].a<<endl<<s[1].g<<endl<<ans;
九十分。
这就迎来了本题对于排序数组的坑点: 如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。

改!

CPP
bool cmp(node a,node b)
{
	return a.g<b.g;//改为小于号
}
         .
         .
         .
         .
         .

  cout<<s[n].a<<endl<<s[n].g<<endl<<ans;

满分了

完整代码

CPP
#include<bits/stdc++.h>
using namespace std;
int n;
int ans;//计算n个学生获得的奖学金的总数。
struct node
{
	string a;
	int b;
	int c;
	char d;
	char e;
	int f;
	int g;//个人总共得到的奖学金。
}s[107];

bool cmp(node a,node b)
{
	return a.g<b.g;
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i].a>>s[i].b>>s[i].c>>s[i].d>>s[i].e>>s[i].f;
		if(s[i].b>80&&s[i].f>=1)//院士奖学金。
		{
			s[i].g+=8000;
		}
		
		if(s[i].b>85&&s[i].c>80)//五四奖学金。
		{
			s[i].g+=4000;
		}
		
		if(s[i].b>90)//成绩优秀奖。
		{
			s[i].g+=2000;
		}
		
		if(s[i].b>85&&s[i].e=='Y')//西部奖学金。
		{
			s[i].g+=1000;
		}
		
		if(s[i].c>80&&s[i].d=='Y')//班级贡献奖。
		{
			s[i].g+=850;
		}
		
		ans+=s[i].g;
	}
	
	sort(s+1,s+n+1,cmp);
	cout<<s[n].a<<endl<<s[n].g<<endl<<ans;
	return 0;//好习惯。
}
望管理员过审!本蒟蒻还没有发过过审的题解。

评论

0 条评论,欢迎与作者交流。

正在加载评论...