题意:

程序设计思维作业和实验使用的实时评测系统,具有及时获得成绩排名的特点,那它的功能是怎么实现的呢?
我们千辛万苦怼完了不忍直视的程序并提交以后,评测系统要么返回AC,要么是返回各种其他的错误,不论是怎样的错法,它总会给你记上一笔,表明你曾经在这儿被坑过,而当你历经千辛终将它AC之后,它便会和你算笔总账,表明这题共错误提交了几次。
在岁月的长河中,你通过的题数虽然越来越多,但通过每题时你所共花去的时间(从最开始算起,直至通过题目时的这段时间)都会被记录下来,作为你曾经奋斗的痕迹。特别的,对于你通过的题目,你曾经的关于这题的每次错误提交都会被算上一定的单位时间罚时,这样一来,你在做出的题数上,可能领先别人很多,但是在做出同样题数的人中,你可能会因为罚时过高而处于排名上的劣势。
例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。

input:
输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式。

output:
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。

Sample Input:
8 20
GuGuDong 96 -3 40(3) 0 0 1 -8 0
hrz 107 67 -3 0 0 82 0 0
TT 120(3) 30 10(1) -3 0 47 21(2) -2
OMRailgun 0 -99 -8 0 -666 -10086 0 -9999996
yjq -2 37(2) 13 -1 0 113(2) 79(1) -1
Zjm 0 0 57(5) 0 0 99(3) -7 0

Sample Output:
TT 5 348
yjq 4 342
GuGuDong 3 197
hrz 3 256
Zjm 2 316
OMRailgun 0 0


思路:

这道题其实是一个排序题,排序依据有三个,最重要的是按照每个学生的得分降序排列,对于得分相同的学生则按照罚时大小升序排列,当得分和罚时都相同的学生则按照名字字典序排列。

罚时的计算方法由题得:AC耗去得时间 + 成功提交的题目曾经提交错误的次数*单位罚时(一直未能AC的题不算到罚时中去)

解题步骤不复杂,输入一个名字后,再存储等于题目个数的数目的字符串表示得分情况,我设立了一个函数用来对表示得分的字符串进行处理,返回值是这道题的罚时。关于数据的记录设立一个结构体用来存储姓名和罚时,设立(题目个数+1)个桶,将每个结构体对象按照答对题目的个数放入各个桶中,最后对每个桶中的结构体进行排序。但实际上完全没有必要这么排序,用sort,重写一下比较函数就行了,下面的代码会展示。


总结:

读懂题意,这是一道多关键字排序题,注意排序方法。
另外关于读入得分的字符串,TA教了一种非暴力解法来判断AC的题目有没有曾经提交错误,如“40(3)”这种形式,即不是遍历一遍看有没有“( ”的暴力方法,下面的代码会贴出来。


代码:
(非sort版本)

#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;struct student
{string name;int fashi;student* pre;student* next;student(string _name, int _fashi = 0, student* _pre = NULL, student* _next = NULL){name = _name;fashi = _fashi;pre = _pre;next = _next;}};int to_number(string x, int begin = 0, int end = 0)
{int value = 0;if (end == 0){int length = x.size();for (int i = 0; i < length; i++){value += (x[i] - '0') * pow(10, length - i - 1);}}else{for (int i = begin; i < end; i++){value += (x[i] - '0') * pow(10 , end - i - 1);}}return value;}int getTime(string& x, int m)
{int length = x.size();bool judge = false;int location;for (int i = 0; i < length; i++){if (x[i] == '('){location = i;judge = true;}}if (judge == false)//没有出现括号return to_number(x);else{int time = to_number(x, 0, location) + m * to_number(x, location + 1, length-1);return time;}}int main()
{int textnumber, m;cin >> textnumber >> m;student** first = new student * [textnumber + 1];student** last = new student * [textnumber + 1];int* num = new int[textnumber + 1];memset(num, 0, sizeof(int) * (textnumber + 1));for (int i = 0; i <= textnumber; i++){first[i] = new student(" ");last[i] = new student("{");first[i]->fashi = -1;last[i]->fashi = 40000;first[i]->next = last[i];last[i]->pre = first[i];}string temp;while (cin >> temp){student* newnode = new student(temp);int score = 0;int fashi = 0;for (int i = 0; i < textnumber; i++){cin >> temp;if (temp[0] == '-' || temp[0] == '0')continue;else {score++;fashi += getTime(temp, m);}}newnode->fashi = fashi;num[score]++;student* it = first[score];for (it; it != last[score]; it = it->next){if (newnode->name < it->name)break;}it->pre->next = newnode;newnode->pre = it->pre;it->pre = newnode;newnode->next = it;}for (int i = 0; i < textnumber + 1; i++){if (num[i] == 0)continue;student* tempt = first[i]->next;student* max = last[i];while (first[i] != max){tempt = first[i]->next;while (tempt != max){if (tempt->fashi > tempt->next->fashi){student* tem = tempt->next;tem->next->pre = tempt;tempt->next = tem->next;tem->next = tempt;tempt->pre->next = tem;tem->pre = tempt->pre;tempt->pre = tem;}else tempt = tempt->next;}max = max->pre;}}for (int i = textnumber; i >= 0; i--){if (num[i] == 0)continue;student* it = first[i]->next;while (it != last[i]){printf_s("%-10s ", it->name.c_str());//***************printf不能直接输出string变量printf_s("%2d ", i);printf_s("%4d\n", it->fashi);it = it->next;}}
}

(sort方法的简化代码)

//存储信息的结构体
struct student
{string name;int score;int fashi;...
}//ps为存储每个人信息的vector对象
vector<student>ps;//sort排序
sort(ps.begin(), ps.end(), [](student &p1, studeny &p2) -> bool{if(p1.score != p2.score) return p1.score > p2.score;
if(p1.fashi != p2.fashi) return p1.fashi < p2.fashi;
return p1.name < p2.name;
});

非暴力解法来判断AC的题目有没有曾经提交错误,即“40(3)”这种形式:

char s[15];
int x, y;
scanf("%s",s);
if(sscanf(s,"%d(%d)",&x,&y) == 1)
......
//sscanf具有返回值表示成功赋值的字段个数,可以凭此判断

B - 爆零(×)大力出奇迹(√) HDU - 2093相关推荐

  1. B - 爆零(×)大力出奇迹(√) HDU - 2093

    题意 例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a ...

  2. AI:大力出奇迹?Bigger is better?AI下一代浪潮?—人工智能的大语言模型(LLMs)的简介、发展以及未来趋势

    AI:大力出奇迹?Bigger is better?AI下一代浪潮?-人工智能的大语言模型(LLMs)的简介.发展以及未来趋势 目录 人工智能的大语言模型(LLMs)-AI下一代浪潮?Bigger i ...

  3. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  4. pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路

    选自Medium 作者:Victor Sanh 机器之心编译 参与:魔王 过去一段时间,大模型层出不穷.在大家纷纷感叹「大力出奇迹」的时候,作为调用预训练语言模型最流行的库,HuggingFace 尝 ...

  5. 2020 计蒜之道 预赛 第一场 爆零记

    爆零记 本来都忘了有这个比赛emmm 然后下午其实也没时间写的样子, 可是一直发短信提醒,, 所以最后还是抽了小半个小时敲了两份模板 但是,,大概是我菜把, 两份都只能过样例.... 而且也调试不出个 ...

  6. 2018NOIp爆零记

    day 0 上午起来,眼睛一睁开就想起来要出发了,心里默默念:相信自己,相信自己... 早上不想颓,于是起来写板子,写着写着就发现近几年的noip会板子没有用啊...该不会白练了一个早上吧... 中午 ...

  7. gdoi2016爆零记

    很对不起老师和同学,这次可真的是全程打酱油了. 赛前立的flag不但没有实现,甚至连体面一点的分数都没有拿到,两天的题目加起来仅仅拿了10分,应该算是倒数. day0: 下午一点从石中坐大巴出发到四会 ...

  8. CSP 复赛爆零指南

    目录 写在前面的话 爆零原因诊断 1.文件夹建立错误 2.没有加文件读写 3.文件夹命名不规范 3.头文件错误 4.注释 5.空间限制 6.测试环境不同 尾声 写在前面的话 感谢@Mars-OJ勰码教 ...

  9. GDKOI2018爆零游记

    GDKOI2018爆0游记 大佬们都在blog上写总结了 但是很高兴yzh大佬的总结里面我的名字出现了三次 不行蒟蒻不能写蒟蒻不能发蒟蒻写不出蒟蒻不能写蒟蒻没得写蒟蒻拒绝写 (发出来会被dalao嘲笑 ...

最新文章

  1. 用python读取图像_Python读取图片属性信息的实现方法
  2. 【复习】---【noip2009 普及】细胞问题 (1)
  3. 超越java jb51_.net mvc超过了最大请求长度的解决方法
  4. java post 请求体构建_java – 从HttpServletRequest获取POST请求体
  5. php数组出栈,php array_pop()数组函数将数组最后一个单元弹出(出栈)
  6. 《Web Load Testing For Dummie》读书笔记
  7. html相同标签替换,html替换把多有标签替换成p标签
  8. mybatis-plus中的select
  9. shell表达语句中,各种符号的释义 用法
  10. Linux服务跟随启动,关于linux服务启动与自启动
  11. GB28181协议简介及实践
  12. Android sdk build-tools sdk tools 历史版本下载
  13. Win 10 专业版重新激活详细操作步骤
  14. Landsat卫星数据标识
  15. css–sprit_CSS速记与速记–使用哪个
  16. 知人知面需知心——论人工智能技术在推荐系统中的应用
  17. C语言数据结构应用(图书借阅系统)
  18. 乔尔谈软件终结篇:分布式版本控制…
  19. 使用DataGrip编写SQL语句时出现此报错:“ Incorrect string value: ‘\xE7\x94\xB7‘ for column ‘xx‘ at row x”
  20. Camera APP 问题集锦

热门文章

  1. 【Linux】_Engineer_用户和组,ACL,磁盘分区,权限,进程管理,防火墙策略
  2. 无法调用自己电脑的gpu,即torch.cuda.is_available()返回false
  3. 第六章 利用数组处理批量数据
  4. 江湖救急(处理域名未备案网站问题)
  5. 超实用一看就懂!汽车常用配件的更换周期
  6. 教你用python做个街拍美图手册
  7. 多旋翼飞行器设计与控制(三):机架设计
  8. 帕金森病会引起哪些并发症
  9. 微生物组被Nature选为2020年最值得关注的技术之一
  10. 程序设计与算法(一)第7周测验(2019夏季)