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

· · 题解

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

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

进入正题

本题就是给定信息问满不满足那几种条件。模拟水题

此题最大的考点就是输入输出。所以,我们可以创建一个结构体数组,存储每一个人的奖学金数量,再进行数组排序,进行输出即可。

你以为这就结束啦?正当我高高兴兴的写下代码时:

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

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

九十分。

这就迎来了本题对于排序数组的坑点: 如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。

改!

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

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

满分了

完整代码

#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;//好习惯。
}

望管理员过审!本蒟蒻还没有发过过审的题解。