【排序+模拟】谁拿了最多奖学金 luogu-1051

奖学金算法解析
本文介绍了一种算法,用于计算学生基于其成绩和特定条件可以获得的奖学金总额。通过输入学生的期末成绩、论文发表情况、班级评议成绩及是否来自西部省份或担任学生干部等信息,算法能够确定每位学生可能获得的多种奖学金及其总金额。

题目描述

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

院士奖学金,每人$ 8000 $元,期末平均成绩高于\(80\)分(\(>80\)),并且在本学期内发表\(1\)篇或\(1\)篇以上论文的学生均可获得;
五四奖学金,每人\(4000\)元,期末平均成绩高于\(85\)分(\(>85\)),并且班级评议成绩高于\(80\)分(\(>80\))的学生均可获得;
成绩优秀奖,每人\(2000\)元,期末平均成绩高于\(90\)分(\(>90\))的学生均可获得;
西部奖学金,每人\(1000\)元,期末平均成绩高于8585分(\(>85\))的西部省份学生均可获得;
班级贡献奖,每人\(850\)元,班级评议成绩高于8080分(\(>80\))的学生干部均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是\(87\)分,班级评议成绩\(82\)分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是\(4850\)元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

分析

废话不多说,直接上代码

AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=300+5;
struct rec{
    char name[40];
    int sum,id;
}st[maxn];
int n;
inline int read(){
    int w=0,X=0; char ch=0;
    while (!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while (isdigit(ch)){X=(X<<1)+(X<<3)+(ch^48);ch=getchar();}
    return w?-X:X;
}
bool cmp(rec a,rec b){
    if (a.sum==b.sum) return a.id<b.id;
    else return a.sum>b.sum;
}
int main(){
    n=read();
    int ans=0;
    for (int i=1;i<=n;i++) {
        st[i].sum=0;
        scanf("%s",st[i].name); st[i].id=i;
        int x=read(),y=read(); char ch,ch2; cin>>ch>>ch2; int z=read();
        if (x>80&&z>=1) st[i].sum+=8000;
        if (x>85&&y>80) st[i].sum+=4000;
        if (x>90) st[i].sum+=2000;
        if (x>85&&ch2=='Y') st[i].sum+=1000;
        if (y>80&&ch=='Y') st[i].sum+=850;
        ans+=st[i].sum;
    }
    sort(st+1,st+1+n,cmp);
    printf("%s\n%d\n%d",st[1].name,st[1].sum,ans);
    return 0;
}

转载于:https://www.cnblogs.com/Dawn-Star/p/9646337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值