1. 程式人生 > >SDNU OJ 1182獎學金

SDNU OJ 1182獎學金

用於C++中,對給定區間所有元素進行排序。標頭檔案是#include <algorithm>。 Sort函式使用模板:
Sort(start,end,排序方法) Sort函式有三個引數: (1)第一個是要排序的陣列的起始地址。
(2)第二個是結束的地址(最後一位要排序的地址的下一地址)
(3)第三個引數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個引數,此時預設的排序方法是從小到大排序。

結構體排序
題目

Description

某小學最近得到了一筆贊助,打算拿出其中一部分為學習成績優秀的前5名學生髮獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學
排在前面,這樣,每個學生的排序是唯一確定的。
任務:先根據輸入的3門課的成績計算總分,然後按上述規則排序,最後按排名順序輸出前五名名學生的學號和總分。注意,在前5名同學中,每個人的獎學金都不相同,因此,你必須嚴格按上述規則排序。例如,在某個正確答案中,如果前兩行的輸出資料(每行輸出兩個數:學號、總分)
是: 7 279

5 279 這兩行資料的含義是:總分最高的兩個同學的學號依次是7號、5號。這兩名同學的總分都是 279
(總分等於輸入的語文、數學、英語三科成績之和) ,但學號為7的學生語文成績更高一些。如果你的前兩名的輸出資料是: 5 279

7 279 則按輸出錯誤處理,不能得分。

Input

輸入包含n+1行:

第1行為一個正整數n(6<=n<=300),表示該校參加評選的學生人數。

第2到n+1行,每行有3個用空格隔開的數字,每個數字都在O到100之間z第1行的3個數
字依次表示學號為j-1的學生的語文、數學、英語的成績。每個學生的學號按照輸入順序編號為l~n (恰好是輸入資料的行號減1)。

所給的資料都是正確的,不必檢驗。

Output

輸出共有5行,每行是兩個用空格隔開的正整數,依次表示前5名學生的學號和總分。

Sample Input

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

Sample Output

6 265
4 264
3 258
2 244
1 237

心路歷程
學了結構體排序之後做的第一個題,因為初學不是很熟練,走了不少彎路。犯的錯誤:
1.寫錯標頭檔案,用sort函式時標頭檔案為#include;
2.bool cmp 時沒有考慮全情況;
3.cout的最後沒有寫<<endl

#include<iostream>
#include<algorithm>
using namespace std;
struct stu
{
    int chinese, math, eng, xh, sum;
};
bool cmp(stu x, stu y)
{
    if(x.sum> y.sum) return 1;
    else if (x.sum==y.sum&&x.chinese>y.chinese) return 1;
    else if (x.sum==y.sum&&x.chinese==y.chinese&&x.xh<y.xh) return 1;
    else return 0;
}//用於後面的sort()函式將每個人按成績和學號排序
int main ()
{
    int n;
    cin>>n;
    stu student [305];
    for(int i=1;i<=n;i++)
        {
            cin>>student[i].chinese>>student[i].math>>student[i].eng;
            student[i].sum=student[i].chinese+student[i].math+student[i].eng;
            student[i].xh=i+1;
        }
    sort(student,student+n,cmp);
    for(int i=1;i<=5;i++)
    {
        cout<< student[i].xh<< " "<< student[i].sum<< endl;
    }//輸出前五名的學號總成績
return 0;
}

(第一次scdn的部落格,紀念一下)