评测系统排名
-
题目要求:例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。
-
输入输出:输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。
Output
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。 -
解题思路:自定义结构体s,记录学生姓名,答对的题数以及罚时长短。将数组开大防止数据量过大数组越界,cmp函数用于排序,做对题目数num用降序,罚时time用升序。
输入的数据中,姓名为字符串类型用string,输出时固定长度为10位,输入数据的情况有三种,一种是0或者小于0的整数表示该题目未通过,不需要计算;第二种是大于0的整数,代表该题通过测试的时间;第三种是一个正整数加上一个括号,括号内的数代表错误次数。将每个人所有的题的得分存进一个字符串数组,数组长等于题目数,定义count作为计数器,记录通过的题目数。
利用循环结构每次从字符串数组中提取一个字符串,length函数记录字符串长,从第一个字符开始遍历如果是大于0小于等于9的数计数器加1,每次前一位乘10加1计算时间,遇到“(”时从括号下一位开始计算错误次数,遇到“)”结束,乘上罚时加上通过时间等于罚时总长,将姓名、题数和时间记录在结构体数组,调用sort进行排序后输出。
-
代码实现:
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
struct S
{
string name;
int num,time;
}sdu[20000];
bool cmp(struct S a,struct S b)
{
if(a.num!=b.num)
return a.num>b.num;
else
{
if(a.time!=b.time)
return a.time<b.time;
else
return a.name[0]<b.name[0];
}
}
int main()
{
int a,b;
cin>>a>>b;
string name;
int ii=0;
while(cin>>name)
{
sdu[ii].name=name;//姓名
//cout<<sdu[ii].name;
string *pro=new string[a];//存储八个题的分数
for(int j=0;j<a;j++)
{
cin>>pro[j];
}
int count=0,tt=0;
for(int j=0;j<a;j++)
{
int length=pro[j].length();
if(pro[j][0]>'0'&&pro[j][0]<='9')
{
int time=0;
char pp;
for(int k=0;k<length;k++)
{
if(pro[j][k]=='(') break;
pp=pro[j][k];
time=time*10+(pp-'0');
}
count++;
tt=tt+time;
}
for(int k=0;k<length;k++)
{
if(pro[j][k]=='(')
{
int time=0;
for(int u=k;u<length;u++)
{
char m=pro[j][u+1];
if(m==')') break;
time=time*10+(m-'0');
}
tt=tt+time*b;
}
}
}
//cout<<"aaaaa";
sdu[ii].num=count;//答对的题的数目
sdu[ii].time=tt;//罚时
ii++;
}
sort(sdu,sdu+ii,cmp);
//cout<<"aaaaa"<<ii<<endl;;
for (int i = 0; i <ii; i++)
{
cout<<setiosflags(ios::left)<<setw(10)<<sdu[i].name<<" ";
cout<<setiosflags(ios::right)<<setw(2)<<sdu[i].num<<" ";
cout<<setiosflags(ios::right)<<setw(4)<<sdu[i].time<<endl;
cout << resetiosflags(ios::right);
// cout<<"bbbbbb";
}
}