C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢? 
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。 
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:

若每次错误提交的罚分为20分,则其排名从高到低应该是这样的: 
Josephus 5 376 
John 4 284 
Alice 4 352 
Smith 3 167 
Bob 2 325 
Bush 0 0 

Input

输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。

Output

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

Sample Input

8 20
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0

Sample Output

Josephus    5  376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0 // WA*10
不说了代码省略
// int sscanf ( const char * s, const char * format, ...);  <cstdio>
// Reads data from s and stores them according to parameter format into the locations given by the additional arguments,
// as if scanf was used, but reading from s instead of the standard input (stdin).
// 多条件排序使用sort+bool
 #include<stdio.h>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std; struct Student
{ char name[]; int ac; int time; }; bool cmp(struct Student a, struct Student b)
{
if(a.ac!=b.ac) return a.ac>b.ac;
if(a.time!=b.time) return a.time<b.time;
return strcmp(a.name,b.name)<;
} int main()
{
int n,m, a,b, len;
struct Student st[], t;
char sta[];
scanf("%d %d", &n, &m);
// 处理输入数据
int i=;
while(scanf("%s", st[i].name)!=EOF)
{
st[i].ac=; st[i].time=;
for(int j=;j<n;j++)
{
scanf("%s", sta);
len=strlen(sta);
if(sta[]!='-')
{
st[i].ac++;
if(sta[len-]==')')
{
sscanf(sta, "%d(%d)", &a,&b);
st[i].time+=a+b*m;
}
else
{
sscanf(sta, "%d", &a);
if(a) st[i].time+=a;
else st[i].ac--;
}
}
}
// 判断是否为新人
for(int j=;j<i;j++)
if(strcmp(st[j].name,st[i].name)==)
{
st[j].ac=st[i].ac; st[j].time=st[i].time;
i--; break;
}
i++;
}
// 排序
sort(st,st+i,cmp);
// 数据输出
for(int j=;j<i;j++)
printf("%-10s %2d %4d\n", st[j].name, st[j].ac, st[j].time);
return ;
}

AC

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; struct Student
{ char name[]; int ac; int time; } st[]; bool cmp(Student a, Student b)
{
if(a.ac!=b.ac) return a.ac>b.ac; // 先按AC题数的多少排,多的在前
if(a.time!=b.time) return a.time<b.time; // 再按时间分的多少排,少的在前
return strcmp(a.name,b.name)<; // 如果凑巧前两者都相等,
} // 则按名字的字典序排,小的在前 int main()
{
int n,m, a,b, len;
scanf("%d %d", &n, &m);
// 处理输入数据
int i=;
while(scanf(" %s", st[i].name)!=EOF)
{
st[i].ac=; st[i].time=;
for(int j=;j<n;j++)
{
scanf("%d", &a);
if(a>)
{
st[i].ac++; st[i].time+=a;
if(getchar()=='(')
{
scanf("%d)", &b);
st[i].time+=b*m;
}
}
}
i++;
}
// 排序
sort(st,st+i,cmp);
// 数据输出
for(int j=;j<i;j++)
printf("%-10s %2d %4d\n", st[j].name, st[j].ac, st[j].time);
return ;
}

AC*2

5N - 考试排名的更多相关文章

  1. HDU——2093考试排名(string类及其函数的运用以及istringstream)

    考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)

    Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错 ...

  3. B - 考试排名

    C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明 ...

  4. HDU 2093 考试排名 模拟题

    解题报告: 题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正 ...

  5. 题解报告:hdu 2093 考试排名

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的 ...

  6. HD-ACM算法专攻系列(16)——考试排名

    问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorith ...

  7. ZJNU 1164 - 考试排名——中级

    1.如果一个单元为0,表示没做过这题,不计入成绩 2.如果一个单位为负数,表示做错了这题,不计入成绩 所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩 将名字和成绩都当作字符串读入 ...

  8. hdu2093 考试排名(还需完善)

    下面代码是借鉴的.好多的知识点等着完善 #include <iostream> #include <string> #include <algorithm> usi ...

  9. HDU2093--考试排名

    考试排名 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

随机推荐

  1. Python的闭包和装饰器

    什么是闭包 python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用. 闭包的作用就是让一个变量能够常驻内存. def ...

  2. gogs windows

    首先安装 git,然后下载 gogs. 在gogs 文件夹位置 启动. gogs.exe web 打开浏览器,输入 127.0.0.1:3000 ,安装 gogs,注意数据库选择,仓库根目录,管理员帐 ...

  3. RDD的概念与创建

    1.RDD是整个Spark的计算基石.是分布式数据的抽象,为用户屏蔽了底层复杂的计算和映射环境 RDD是不可变的,如果需要在一个RDD上进行转换操作,则会生成一个新的RDD RDD是分区的,RDD里面 ...

  4. leetcode每日刷题计划-简单篇day12

    Num 125 验证回文串 Valid Palindrome 非常有收货的一道题嘻嘻嘻,本来是考试期间划水挑的题,坑点有点多 第一个是注意对temp1和temp2中途更新的判断 第二个是字符串频繁的作 ...

  5. Mybatis pageHelper.startPage(...)是物理分页

    使用PageHelper.startPage(...)进行物理分页 业务需求只显示其中的100条数据 之前是在业务逻辑里对参数limit进行了处理 后来试试sql的limit查询100条数据 但是不确 ...

  6. 我的coding地址

    https://dev.tencent.com/u/dtid_d6b0780bdefc3f9c/follower#1

  7. JAVA_04

    * a:局部代码块 * 在方法中出现:限定变量生命周期,及早释放,提高内存利用率 * b:构造代码块 (初始化块) * 在类中方法外出现:多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并 ...

  8. spark报错:warn util.utils::service 'sparkUI' can not bind on part 4040.Attempting port 4041.

    转载自:https://blog.csdn.net/weixin_41629917/article/details/83190258

  9. Habits of Considerate People

    Habits of Considerate People体贴人的八种习惯哲学家亚瑟·叔本华曾经说过:“蜡之可贵,在于燃烧自己温暖他人,人之可贵,在于屈尊敬贤彬彬有礼”,事实的确如此.善意与体贴能够抚慰 ...

  10. hbase-hive整合及sqoop的安装配置使用

    从hbase中拿数据,然后整合到hbase中 上hive官网  -- 点击wiki--> hive hbase integation(整合) --> 注意整合的时候两个软件的版本要能进行整 ...