您的位置:首页 > 其它

题目1061:成绩排序

2014-02-23 21:18 169 查看
题目描述:

    有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

输入:

    测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。

    每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。

输出:

    将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。

    然后输出学生信息,按照如下格式:

    姓名 年龄 成绩

样例输入:
3
abc 20 99
bcd 19 97
bed 20 97


样例输出:
bcd 19 97
bed 20 97
abc 20 99


提示:

学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

#include <iostream>

using namespace std;

struct Stu
{
string name;
int age;
int score;

};

int compare(string a,string b)
{
int m = a.size();
int n = b.size();
int min = (n<m)?n:m;
for(int i=0;i<min;i++)
{
if(a[i]<b[i])
return 1;
else if(a[i]>b[i])
return 2;
}
if(m<n) return 1;
else if(m>n) return 2;
else return 0;
}

bool compare(Stu a,Stu b)
{
if((a.score<b.score||
(a.score==b.score&&(compare(a.name,b.name)==1)) ||
(a.score==b.score&&(compare(a.name,b.name)==0)&&a.age<b.age)))
return true;
return false;
}

void quickSort(Stu arr[],int left,int right)
{
if(left<right)
{
int i = left,j = right;
Stu key = arr[left];
while(i<j)
{
while(i<j&&compare(key,arr[j]))
j--;
if(i<j) arr[i++]=arr[j];
while(i<j&&compare(arr[i],key))
i++;
if(i<j) arr[j--]=arr[i];
}
arr[i]=key;
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
}

int main()
{
Stu student[1000];
int num;
while(cin>>num)
{
for(int i=0;i<num;i++)
{
cin>>student[i].name>>student[i].age>>student[i].score;

}
quickSort(student,0,num-1);
for(int i=0;i<num;i++)
{
cout<<student[i].name<<" "<<student[i].age<<" "<<student[i].score<<endl;
}

}

return 0;
}

/**************************************************************
Problem: 1061
User: 小燧石
Language: C++
Result: Accepted
Time:690 ms
Memory:1520 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM