题目描述
根据做题的ac数、时间以及姓名字典排序。每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。未ac的不计入时间,ac的题目,时间为a+b*单位罚时。
样例
Input
输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。
Output
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。
样例输入
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
样例输出
TT 5 348
yjq 4 342
GuGuDong 3 197
hrz 3 256
Zjm 2 316
OMRailgun 0 0
思路
学生结构体包括姓名,ac数,时间。
排序函数:多关键字排序,先判断ac数,ac数多的排名靠前,如果相等,再判断时间,时间少的排名靠前,如果相等,按姓名字典再排序。
学生数据处理:对学生每题的信息采用int输入,判断输入正负,负数表明该题未ac,不存在罚时,继续输入下一题信息,正数则将时间计入学生结构体time中,如果在输入int类型数据后有字符‘(’表明存在罚时,此时再输入int类型的罚时,将罚时加入学生结构体的time中。
对学生结构体采用sort函数排序
按照题目要求格式进行输出
总结
本题的关键在于将输入的学生数据进行准确的判断,我采用的是将数据和字符分开读入(加入判断是否需要读字符的判断条件)。另一种对数据进行处理的思路是采用string读入学生每道题的数据,string以空格和换行为下一条数据的分界,输入的学生的做题信息刚好以空格分隔,判断string中是否含有‘(’ ,对‘)’之前的数据进行处理也可以得到相应的罚时。(开始写的时候没想到string,现在觉得这个方法也挺方便。
代码
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <stdio.h>
#include <string.h>
using namespace std;
struct node
{
char name[20];
int ac;//ac数
int time;
};
bool cmp(node x,node y)
{
if(x.ac!=y.ac)//比较ac数
{
if(x.ac>y.ac)
return true;
else return false;
}
else if(x.time!=y.time)//比较罚时
{
if(x.time<y.time)
return true;
else return false;
}
else//比较姓名字典序
return (strcmp(x.name,y.name)<0);
}
int main()
{
struct node stu[1000];
// memset(stu,0,sizeof(stu));
int n,m;
cin>>n>>m;
char ch[20];
int index=0;//学生序号
while(cin>>stu[index].name)
{
stu[index].ac=0;
stu[index].time=0;
for(int i=0;i<n;i++)
{
int s;
int err;
cin>>s;
char ch;
if(s<=0)
continue;
stu[index].ac++;
stu[index].time+=s;//解题所用时间
if(getchar()=='(')
{
cin>>err;
cin>>ch;
stu[index].time+=err*m;
}
}
index++;
}
sort(stu,stu+index,cmp);
for(int i=0;i<index;i++)
{
cout<<left<<setw(10)<<stu[i].name<<" "<<right<<setw(2)<<stu[i].ac<<" "<<setw(4)<<stu[i].time<<endl;
}
}