1055: [排序] 獎學金

1055: [排序] 獎學金


題目描述
某小學最近得到了三胖的一筆贊助,打算拿出其中一部分爲學習成績優秀的前5名學生髮獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學排在前面,這樣,每個學生的排序是唯一確定的。
任務:先根據輸入的3門課的成績計算總分,然後按上述規則排序,最後按排名順序輸出前5名學生的學號和總分。注意,在前5名同學中,每個人的獎學金都不相同,因此,你必須嚴格按上述規則排序。例如,在某個正確答案中,如果前兩行的輸出數據(每行輸出兩個數:學號、總分)是:
7 279
5 279
這兩行數據的含義是:總分最高的兩個同學的學號依次是7號、5號。這兩名同學的總分都是279(總分等於輸入的語文、數學、英語三科成績之和),但學號爲7的學生語文成績更高一些。如果你的前兩名的輸出數據是:
5 279
7 279
則按輸出錯誤處理,不能得分。
輸入
輸入包含n+1行:
第l行爲一個正整數n,表示該校參加評選的學生人數。
第2到年n+l行,每行有3個用空格隔開的數字,每個數字都在0到100之間。第j行的3個數字依次表示學號爲j-1的學生的語文、數學、英語的成績。每個學生的學號按照輸入順序編號爲1~n(恰好是輸入數據的行號減1)。
所給的數據都是正確的,不必檢驗。
輸出
輸出共有5行,每行是兩個用空格隔開的正整數,依次表示前5名學生的學號和總分。
樣例輸入

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

樣例輸出

6 265
4 264
3 258
2 244
1 237

問題分析:
這是我們學校oj上的一道題,題目不難,就是處理的東西有點複雜,使用結構體或者class都可以很好的解決,我這裏使用的c++的class來統一存放每個學生的各個成績,總分和學號,這樣問題的處理就非常簡單了(我這裏只使用了c++裏class最簡單的運用,你使用結構體也能實現)。下面是代碼。

代碼(已通過測試):

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;

class student//定義一個叫student的類//
{
public:
    int number,china,math,english,all;//由於我只是刷題,而且爲了方便調用,這裏的數據全部放在了public裏面//
    student()//構造函數,如果未輸入值,全部默認爲0//
    {
        number=0;
        china=0;
        math=0;
        english=0;
        all=0;
    };
    void getstudent();//方便輸入值//
};
void student::getstudent()
{
    cin>>china>>math>>english;
}
int main()
{
    int n,i,j;
    cin>>n;
    student x[n],temp;//定義n個學生數據和一個temp用來做交換的媒介//
    for(i=0;i<n;i++){
        x[i].number=i;//學號不是自己手動輸入的,所以這裏把它自動賦值//
        x[i].getstudent();//手動輸入學生的各個數據//
    }
    for(i=0;i<n;i++){
        x[i].all=x[i].china+x[i].math+x[i].english;//逐個計算學生成績的總和//
    }
    for(i=0;i<n;i++){//簡單的冒泡排序,使用學生總成績從大到小來排//
        for(j=0;j<n-1;j++){
            if(x[j].all<x[j+1].all){
                temp=x[j];
                x[j]=x[j+1];
                x[j+1]=temp;
            }
        }
    }
    for(i=0;i<n-1;i++){//把排好的成績逐個遍歷//
        if(x[i].all==x[i+1].all){//如果某個學生成績和後面的相同//
            if(x[i].china<x[i+1].china){//則比較他們的語文成績,比後面的小,則讓後面的同學排在他前面,即交換位置//
                temp=x[i];
                x[i]=x[i+1];
                x[i+1]=temp;
            }else if(x[i].china==x[i+1].china)//如果前後兩人的語文成績也相同//
            {
                if(x[i].number>x[i+1].number){//則比較他們的學號,學號小的排到前面//
                    temp=x[i];
                    x[i]=x[i+1];
                    x[i+1]=temp;
                }
            }
        }
    }
    for(i=0;i<5;i++){
        cout<<x[i].number+1<<" "<<x[i].all<<"\n";
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章