【題解】Luogu P1051 【谁拿了最多奖学金】

再来一波面向对象(C++版)

注意看题注意看题注意看题这题注意看题注意看题注意看题

本题:第三行是这N个学生获得的奖学金的总数。

然后就创一个学生类,包含所需信息,然后再创对象数组储存每一个学生信息。

然后按题意模拟即可

最后输出

    #include<cstdio>
    #include<algorithm>
    #include<string>
    #include<iostream>
    using namespace std;
    //设计类
    class Student{
        public:
            string name;//名字
            int number;//序号(用于判断输入顺序)
            int aveScore;//期末平均成绩
            int classScore;//班级议评成绩
            char isCadre;//是否干部
            char isWest;//是否西部
            int paper;//论文数
            int money;//个人钱数
    };
    //比较函数:钱多的在前,相同钱数比序号,序号小的在前
    bool compare(Student s1,Student s2){
        if(s1.money == s2.money){
            return s1.number < s2.number;
        }else{
            return s1.money > s2.money;
        }
    }
    int main(){
        int n;
        scanf("%d",&n);
        Student s[100];//对象数组
        int delta1,delta2;//辅助输入,能不用cin/cout就不用
        char delta3,delta4;//同上
        int delta5,total = 0;//前二者同上,最后一个total为总钱数
        //输入,预处理
        for(int i = 0;i < n;i++){
            cin >> s[i].name;
            //cin >> delta1 >> delta2 >> delta3 >> delta4 >> delta5;
            scanf("%d %d %c %c %d",&delta1,&delta2,&delta3,&delta4,&delta5);
            s[i].aveScore = delta1;
            s[i].classScore = delta2;
            s[i].isCadre = delta3;
            s[i].isWest = delta4;
            s[i].paper = delta5;
            s[i].money = 0;
            s[i].number = i + 1;//序号
        }
        //模拟判断钱数
        for(int i = 0;i < n;i++){
            if(s[i].aveScore > 80 && s[i].paper > 0){
                s[i].money += 8000;
            }
            if(s[i].aveScore > 85 && s[i].classScore > 80){
                s[i].money += 4000;
            }
            if(s[i].aveScore > 90){
                s[i].money += 2000;
            }
            if(s[i].aveScore > 85 && s[i].isWest == 'Y'){
                s[i].money += 1000;
            }
            if(s[i].classScore > 80 && s[i].isCadre == 'Y'){
                s[i].money += 850;
            }
        }
        //真·sort排序
        sort(s,s + n,compare);
        cout << s[0].name << endl;
        cout << s[0].money << endl;
        //计算总钱数
        for(int i = 0;i < n;i++){
            delta6 += s[i].money;
        }
        cout << delta6 << endl;
        return 0;
}

发布者:Cinema

成功的道路并不狭窄,因为大部分人都在颓废。

留下评论

电子邮件地址不会被公开。 必填项已用*标注