總時間限制:1000ms 內存限制:65536kB
描述
給出班裏某門課程的成績單,請你按成績從高到低對成績單排序輸出,如果有相同分數則名字字典序小的在前。
輸入
第一行爲n (0 < n < 20),表示班裏的學生數目;
接下來的n行,每行爲每個學生的名字和他的成績, 中間用單個空格隔開。名字只包含字母且長度不超過20,成績爲一個不大於100的非負整數。
輸出
把成績單按分數從高到低的順序進行排序並輸出,每行包含名字和分數兩項,之間有一個空格。
樣例輸入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
樣例輸出
Joey 92
Hanmeimei 90
Kitty 80
Tim 28
解析
這個題目吧,我看到好多人用了sort函數,但是這種簡單的題直接冒泡排序一波就可以吧。
這個題有一點沒有講清楚,那就是,只要求了“把成績單按分數從高到低的順序進行排序並輸出”,而實際上在評判的時候系統還會判斷你有沒有按照名字來排序。因此這裏的要求實際上是兩個,一是對分數排序,二是對分數相同時的名字排序。
這裏涉及到名字排序的問題,也就是對字符串排序,這裏我直接使用了string來定義名字,因此可以直接用 " > < =" 來判斷名字的順序,使用char數組時可以使用cstring裏面的strcmp函數等進行判斷排序。
好啦,讓我們來欣賞一段代碼吧
代碼
#include<iostream>
struct stusco
{
std::string name;
int score;
};
int main()
{
int n;
std::cin >> n;
stusco classinfo[n];
for(int i=0;i<n;i++)
{
std::cin >> classinfo[i].name >> classinfo[i].score;
}
stusco tmp;
for(int i=n-1;i>0;i--)
{
for(int j=0;j<i;j++)
{
if(classinfo[j+1].score>classinfo[j].score)
{
tmp=classinfo[j];
classinfo[j]=classinfo[j+1];
classinfo[j+1]=tmp;
}
if(classinfo[j+1].score==classinfo[j].score&&
classinfo[j+1].name<classinfo[j].name) //當分數相同時對name排序
{
tmp=classinfo[j];
classinfo[j]=classinfo[j+1];
classinfo[j+1]=tmp;
}
}
}
for(int i=0;i<n;i++)
{
std::cout << classinfo[i].name << " " << classinfo[i].score << "\n";
}
return 0;
}