zoukankan      html  css  js  c++  java
  • 来自1068

    之前已经贴过代码,但没有题,现在把题目码出

    某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 
      任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是: 
      7 279 
      5 279 
      这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 
      5 279 
      7 279 
      则按输出错误处理,不能得分。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct student                //dingyi xuesheng
    {
               int score;
              int chinese;
              int id;
    };
    student stu[310];
    int n,chinese,math,english;
    void init()
    {
              cin>>n;
             for(int i=1;i<=n;i++)
            {
                   cin>>chinese>>math>>english;
                   stu[i].chinese=chinese;
                  stu[i].id=i;
                   stu[i].score=chinese+math+english;
    }
    }
    void myswap(student &x,student &y) //交换
    {
    student temp;
    temp=x;x=y;y=temp;
    }
    void mysort() //排序
    {
    for(int i=1;i<n;i++)
    {
    bool flag=1;
    for(int j=1;j<=n-i;j++)
    {
    if( (stu[j].score<stu[j+1].score)|| ((stu[j].score==stu[j+1].score)&&(stu[j].chinese<stu[j+1].chinese))||
    ((stu[j].score==stu[j+1].score)&&(stu[j].chinese==stu[j+1].chinese)&&(stu[j].id>stu[j+1].id)))
    {
    flag=0;
    swap(stu[j],stu[j+1]);
    }
    }
    if(flag) break;
    }
    return;
    }
    void print() //输出
    {
    for(int i=1;i<=5;i++)
    {
    cout<<stu[i].id<<' '<<stu[i].score<<endl;
    }
    }
    int main()
    {
    init();
    mysort();
    print();
    return 0;
    }





    if((stu[j].score<stu[j+1].score)||((stu[j].score==stu[j+1].score)&&(stu[j].chinese<stu[j+1].chinese))||
    ((stu[j].score==stu[j+1].score)&&(stu[j].chinese==stu[j+1].chinese)&&(stu[j].id>stu[j+1].id)))

    这两行代码是这个程序的精华部分,是对逻辑运算的一个考验

    判断如下

    如果后一个比前一个分数高,交换,,这时就把原来无序的排为有序的

    或者如果前后分数相同,就开始比较语文成绩,这个是前面结构体的应用;

    最后是总分语文都相同时,比较id



    同时呢,这个代码对冒泡有一个优化

    默认都是排好序的;但是如果出现前后顺序不对,就有bool的flag=0;

    最后如果都排好

    就有flag=1继续执行程序

  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/supersumax/p/5882481.html
Copyright © 2011-2022 走看看