1.题意
提交实验使用的实时评测系统,排名按多关键字排序,第一关键字为题目ac的个数,第二关键字为时间(包括做题时间与罚时),第三关键字为名字的字典序,小的在前。
例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。
2.样例
Input:
输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状
Output:
根据这些学生的得分现状,输出一个实时排名
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
注:每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)
3.解题思路
分析:
1.解决读入学生成绩问题,a(b)字符怎样读入,用sscanf格式化输入;
2.用sscanf判断及正确读入数据后进行时间计算;
3.多关键字排序算法
bool com(sc x,sc y)
{
if(x.ac==y.ac)
{
if(x.time==y.time) return strcmp(x.name,y.name)<0;
return x.time<y.time;
}
return x.ac>y.ac;
}
比较两个字符串大小,用strcmp()函数进行比较
4.按照要求对齐格式输出,默认右对齐,加"-"表示左对齐
//C中
printf("%-10s %2d %4d\n",arr[k].name,arr[k].ac,arr[k].time);
//C++中
cout<<std::left<<setw(10)<<arr[i].name<<" ";
4.总结
该题主要考察的就是string的标准输入输出,以及string相应的函数运用
5.AC代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
struct sc{
char name[20];
int ac;
int time;
}arr[1000];
bool com(sc x,sc y)
{
if(x.ac==y.ac)
{
if(x.time==y.time) return strcmp(x.name,y.name)<0;
return x.time<y.time;
}
return x.ac>y.ac;
}
int main()
{
int n,m,i=0,num,t1,t2;
char score[20];
cin>>n>>m;
while(~scanf("%s",arr[i].name))
{
arr[i].ac=0;
arr[i].time=0;
for(int j=0;j<n;j++)
{
cin>>score;
num=sscanf(score,"%d(%d)",&t1,&t2);
if(num==2)
{
arr[i].ac++;
arr[i].time=arr[i].time+t1+t2*m;
}
if(num==1&t1>0)
{
arr[i].ac++;
arr[i].time=arr[i].time+t1;
}
}
i++;
}
sort(arr,arr+i,com);
for(int k=0;k<i;k++)
{
printf("%-10s %2d %4d\n",arr[k].name,arr[k].ac,arr[k].time);
}
return 0;
}