1. 程式人生 > >ACM基礎之結構體排序

ACM基礎之結構體排序

問題 E: 【排序】排名

時間限制: 1 Sec  記憶體限制: 64 MB


題目描述

班上剛測試了幾門課,現在資訊科技課的老師要分析一些功課之間的成績關係,看看每個人的資訊科技課成績排名以及數學課成績排名,並按資訊科技課的成績從高到低排列,如果兩個人的資訊科技課成績相同,則學號小的排在前面。老師把任務交給了資訊學最好的你,請你程式設計完成這個任務。

 

輸入

第1行一個整數N,表示共有N個同學的成績(1≤N≤45);後面有N行,每行4個整數,分別表示一個同學的:語文、數學、英語、資訊科技成績(成績C:0≤C≤120)。

 

輸出

共N行,每行6個數據,分別對應一個同學的語文、數學、英語、資訊科技成績和資訊科技及數學成績的排名。

 

樣例輸入

3
90 95 89 110
95 120 78 115
96 97 103 92

樣例輸出

95 120 78 115 1 1
90 95 89 110 2 3
96 97 103 92 3 2


先上程式碼(C++):

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int ch,ma,en,co;//語文 數學 外語 資訊成績。
int mr;//數學排名。
int id;//學號。
};
int cmp(stu a,stu b)
{
if(a.ma==b.ma)
{
return a.id<b.id;
}
else
{
return a.ma>b.ma;
}
}
int cmp1(stu a,stu b)
{
if(a.co==b.co)
{
return a.id<b.id;
}
else
{
return a.co>b.co;
}
}
int main()
{
int n;
cin>>n;
stu s[n+5];
for(int i=0;i<n;i++)
{
cin>>s[i].ch>>s[i].ma>>s[i].en>>s[i].co;
s[i].id=i+1;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
s[i].mr=i+1;
}
sort(s,s+n,cmp1);
for(int i=0;i<n;i++)
{
printf("%d %d %d %d %d %d\n",s[i].ch,s[i].ma,s[i].en,s[i].co,i+1,s[i].mr);
}
return 0;
}

 

 

思路:

此問題明顯考察的結構體排序,首先重寫排序演算法sort,cmp,對結構體裡的“數學”元素ma進行排序,然後對結構體中的數學排名mr進行賦值。然後再次重寫排序cmp1.為了省事,不對資訊co進行賦予排名,直接輸出i+1,

注意:

重寫結構體時候不能漏掉“若成績相同時候按照學號排序”此點,故重寫時候進行簡單的if判定。

 

 

PS:菜鳥一個,大一放棄過ACM,現在在俱樂部與新生一起划水。