homework(结构体排序+map)

还挺有意思的一道题,值得记录。
大一上用二维数组过的,现在想想真是佩服。。。。一看就感觉要结构体排序,但是会出现同一学生有多道题分的情况,这样只用结构体很难处理,想了很久决定还是结合map来做吧。。。写起来还挺顺利,但是这运行时间。。
在这里插入图片描述

Homework
题目描述

鉴于很多同学Ctrl+A,Ctrl+C,Ctrl+V的问题,Eric想重新计算一下作业成绩,成绩计算的规则如下:

每道题按正确提交的先后顺序给分,第1-12名32,13-24名16分,25-48名8分,49-96名4分,97-192名2分,其余1分。
学生所有题目的分数累加和为其积分。
作业成绩=round(100+log(1+本人积分−最高积分最高积分)×10),其中round为四舍五入取整,log以自然对数为底。
Eric已经通过查询数据库得到每个人每道题的排名情况,请写一个程序帮Eric算一下所有人的作业成绩。

输入 输入包含若干行,每行是三个部分,题目号,学号,排名。 学生人数不超过500,题目数量不超过200。
输出 输出学号和成绩,按成绩逆序,学号,并按作业成绩逆序,学号正序排列显示。

输入
1054 2015551111 1
1054 2015551101 2
1054 2015551119 3
1054 2015551115 4
1054 2015551110 5
1054 2015551114 6
1054 2015551128 7
1054 2015551118 8
1054 2015551102 9
1054 2015551130 10
1054 2015551139 11
1054 2015551135 12
1054 2015551120 13
1054 2015551129 14
1054 2015551104 15
1054 2015551112 16
1054 2015551116 17
1054 2015551138 18
1054 2015551103 19
1054 2015551131 20
1054 2015551132 21
1054 2015551106 22
1054 2015551136 23
1054 2015551124 24
1054 2015551126 25
1054 2015551113 26
1054 2015551109 27
1054 2015551117 28
1054 2015551125 29
1054 2015551127 30
1054 2015551123 31
1054 2015551133 32
1054 2015551134 33
1054 2015551121 34
1054 2015551122 35
1054 2015551137 36

输出
2015551101 100
2015551102 100
2015551110 100
2015551111 100
2015551114 100
2015551115 100
2015551118 100
2015551119 100
2015551128 100
2015551130 100
2015551135 100
2015551139 100
2015551103 93
2015551104 93
2015551106 93
2015551112 93
2015551116 93
2015551120 93
2015551124 93
2015551129 93
2015551131 93
2015551132 93
2015551136 93
2015551138 93
2015551109 86
2015551113 86
2015551117 86
2015551121 86
2015551122 86
2015551123 86
2015551125 86
2015551126 86
2015551127 86
2015551133 86
2015551134 86
2015551137 86

#include <bits/stdc++.h>
using namespace std;
const int N =1e5 + 10;
struct stu{
    string num;
    int score;
}s[N];
int maxn;
int comp(int x)
{
    return round(100 + log(1 + (double)(x - maxn) / maxn) * 10);
}
bool cmp(stu a, stu b)
{
    if(a.score > b.score) return 1;
    else if(a.score == b.score && a.num < b.num) return 1;
    return 0;
}
int main()
{
    int a, c;
    string b;
    int m = 0;
    map<string, int> ma;//记录每一名学生的总分
    while(~scanf("%d", &a)){
        cin >> b;
        scanf("%d", &c);
        if(c <= 12) c = 32;
        else if(c <= 24) c = 16;
        else if(c <= 48) c = 8;
        else if(c <= 96) c = 4;
        else if(c <= 192) c = 2;
        else c = 1;
        ma[b] += c;
    }
    for(map<string, int>::iterator it = ma.begin(); it != ma.end(); ++ it)
        maxn = (it -> second > maxn) ? it -> second : maxn;
    int k = 0;
    for(map<string, int>::iterator it = ma.begin(); it != ma.end(); ++ it){
        it -> second = comp(it -> second);
        s[k ++] = {it -> first, it -> second};
    }
    sort(s, s + k, cmp);
    for(int i = 0; i < k; ++ i) cout << s[i].num << " " << s[i].score << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值