1482 獎學金 關於結構體與qsort的思考)

2021-07-07 09:23:10 字數 3386 閱讀 1233

constraints

time limit: 1 secs, memory limit: 32 mb

description

某小學最近得到了一筆贊助,打算拿出其中一部分為學習成績優秀的前5名學生發獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學排在前面,這樣,每個學生的排序是唯一確定的。

任務:先根據輸入的3門課的成績計算總分,然後按上述規則排序,最後按排名順序輸出前5名學生的學號和總分。注意,在前5名同學中,每個人的獎學金都不相同,因此,你必須嚴格按上述規則排序。例如,在某個正確答案中,如果前兩行的輸出資料(每行輸出兩個數:學號、總分)是:

7 279

5 279

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

5 279

7 279

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

input

輸入包含多組測試資料,每個測試資料有n+1行。

第1行為乙個正整數n,表示該校參加評選的學生人數。

第2到n+1行,每行有3個用空格隔開的數字,每個數字都在0到100之間。第j行的3個數字依次表示學號為j-1的學生的語文、數學、英語的成績。每個學生的學號按照輸入順序編號為1~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

8 80 89 89

88 98 78

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

8 265

2 264

6 264

1 258

5 258

problem source

noip 2007

#include 

#include

#include

struct edgstu[100];

int comp(const

void*p1,const

void*p2)

return c->num > d->num?1:-1;

}//qsort比較函式

int main()

qsort(stu, n, sizeof(stu[0]), comp);

for (int i = 0; i < 5; i++)

scanf("%d", &n);

}return

0;}

cpp答案!

#include

#include

using

namespace

std;

struct node

; struct cmp

else

else

} }

};

int main()

for(int i = 1; i <= 5; i++)

} return

0;

}

結構體替換的函式

void swap(struct edg *a,struct edg *b)

關於qsort的五種種用法

compare( (void ) & elem1, (void ) & elem2 );

compare 函式的返回值 描述

< 0 elem1將被排在elem2前面

0 elem1 等於 elem2

.>0 elem1 將被排在elem2後

void quicksort(int h,int t)//快排的實現!

a[mid]=a[j];

a[j]=x;

quicksort(h,j-1);

quicksort(j+1,t);

return

;}

1 數字的排序

int comp(const

void *a, const

void *b)

qsort(word,100,sizeof(word[0]),cmp);

3 對double型別的排序

這裡做個注釋,本來是因為要判斷如果a==b返回0的,但是嚴格來說,兩個double數是不可能相等的,只能說fabs(a-b)<1e-20之類的這樣來判斷,所以這裡只返回了1和-1

#include 

#include

double s[1000];

int i,n;

int cmp(const

void * a, const

void * b)

int main()

4 對結構體的排序

包括一級,二級……實際上都是相同的,只是在cmp函式中有所不同。

struct in 

s[100]

int cmp( const

void *a ,const

void *b)

5 按字串的字典序

struct in 

s[100];

//按照結構體中字串str的字典順序排序

int cmp ( const

void *a , const

void *b )

qsort

(s,100,sizeof(s[0]),cmp);

補充:

struct 和 typedef struct的區別:

獎學金(結構體)

輸入的第一行是乙個整數n 1 n 100 表示學生的總數。接下來的n行每行是一位學生的資料,從左向右依次是姓名,期末平均成績,班級評議成績,是否是學生幹部,是否是西部省份學生,以及發表的 數。姓名是由大小寫英文本母組成的長度不超過20的字串 不含空格 期末平均成績和班級評議成績都是0到100之間的整...

1589 獎學金 (結構體)

時間限制 1 sec 記憶體限制 128 mb 提交 44 解決 28 提交 狀態 討論版 第一行是乙個整數n 1 n 10 表示學生的總數。接下來的n行,每行是一位學生的資料,從左向右依次是姓名,期末平均成績,班級評議成績,是否是學生幹部,是否是西部省份學生,以及發表的 數。姓名是由大小寫英文本母...

關於結構體

關鍵字struct表示定義的是結構體的資料型別,緊隨其後的識別符號student是結構體型別名。花括號中依次列舉該型別的每個成員資料型別及其名稱,每個成員的資料型別可以是基本資料型別或者自定義資料型別,但是不能重名。結構的成員也成為域。結構體型別的定義以乙個分號結束。由於資料型別僅是為變數分配儲存空...