Home | Web Board | ProblemSet | Standing | Status | Statistics |
Problem F: 综合测评成绩排序
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1034 Solved: 160
[ Submit][ Status][ Web Board]
Description
实现一个班里学生的综合测评成绩(包括数学、英语、政治三门课程,学分、权重等信息)计算,并按照学生综合测评成绩进行排序。
Input
输入包括多组数据,每组数据的第一行是一个整数n(n<50000),表示有多少个学生;接下来n + 1行,第一行输入为三个实数(介于0到1之间),分别代表三科成绩依次在综合测评中所占的权重;之后输入的n行中每行代表一个学生,每行依次为姓名(注:姓名只含有字母和下划线,不超过25个字符),语文,数学,英语三门课的成绩(注:成绩为实数,介于0到100之间),综合测评成绩为所有科目分数和加权和。
Output
对于每组数据,综合测评成绩排名从高到低输出所有学生(成绩相同按姓名字典序排列),每个学生一行,每行依次为姓名,语文,数学,英语三门课成绩,综合测评得分,具体见样例。
Sample Input
10.5 0.5 0.5zhangsan 100 100 10030.2 0.3 0.6zhangsan 100 20 50lisi 55 66 77wangwu 22 33 66
Sample Output
zhangsan 100.0 100.0 100.0 150.0lisi 55.0 66.0 77.0 77.0zhangsan 100.0 20.0 50.0 56.0wangwu 22.0 33.0 66.0 53.9
HINT
考察知识点:小数据量的排序问题,时间复杂度O(nlog)),空间复杂度O(n)
禁用库函数排序
Append Code
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef struct
{
string name;
double chinese,math,english,sum;
} student;
void Qst(student *s,int low,int high)
{
int x=low;
int y=high;
student st=s[low];
if(low >= high)
{
return;
}
while(x<y)
{
while(x<y&&s[y].sum>=st.sum)
{
if(s[y].sum== st.sum&&s[y].name>= st.name)
break;
--y;
}
s[x]=s[y];
while(x < y && s[x].sum<=st.sum)
{
if(s[x].sum== st.sum&&s[x].name<= st.name)
break;
++x;
}
s[y]=s[x];
}
s[x]=st;
Qst(s,low,x-1);
Qst(s,x+1,high);
}
int main()
{
int n,i;
string name;
double a,b,c;
while(cin>>n>>a>>b>>c)
{
student s[n];
for(i=0; i<n; i++)
{
cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;
s[i].sum=0;
s[i].sum+=s[i].chinese*a;
s[i].sum+=s[i].math*b;
s[i].sum+=s[i].english*c;
}
Qst(s,0,n-1);
for(i=n-1; i>=0; i--)
{
cout<<s[i].name<<" ";
printf("%.1lf %.1lf %.1lf %.1lf\n",s[i].chinese,s[i].math,s[i].english,s[i].sum);
}
}
}