数据结构记录--综合测评成绩排序

HomeWeb BoardProblemSetStandingStatusStatistics

Problem F: 综合测评成绩排序

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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

[ Submit][ Status][ Web Board]
#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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值