您的位置:首页 > 其它

B - 爆零(×)大力出奇迹(√)

2020-03-10 01:09 85 查看

题目

某次考试一共八道题(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

思路

数据结构:

struct student:记录每个学生姓名、ac数、罚时信息
char a[15] :保存每次录入的一个学生的一个题的成绩情况

解法

step0 重载student结构体的比较运算符使其满足排序规律
step1 接收学生的姓名,若未接收到姓名则转到step3
step2 用scanf("%s",a);count=sscanf(a,"%d(%d)",&x,&y);接收step1中学生的做题情况,当count为2时累加ac题数和罚时,当count为1时判断数的正负,为正时累加相应的ac题数和罚时 转到step2继续执行
step3 对student调用sort函数进行排序,用 printf("%-10s %2d %4d\n",s[j].name,s[j].ac,s[j].time);输出最终的排序结果

总结

1、判断字典序:return strcmp(this->name,s.name)<0;
2、scanf的返回值为录入变量的数量,记录一下用法:

scanf("%s",a);
count=sscanf(a,"%d(%d)",&x,&y);

3、记录一个更好的解法:

代码

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct student
{
char name[20];
int ac=0;
int time=0;
bool operator<(const student &s) const//按照排序规则重载比较函数
{
if(this->ac!=s.ac)
return this->ac>s.ac;
if(this->time!=s.time)
return this->time<s.time;
return strcmp(this->name,s.name)<0;
}
}s[1000];

int main()
{
int n,m,x,y,count;
char a[15];
cin>>n>>m;
int i=0;
while(~scanf("%10s",s[i].name))
{

s[i].ac=0;
s[i].time=0;
//		cout<<s[i].name<<endl;
for(int j=0;j<n;j++)
{
scanf("%s",a);
count=sscanf(a,"%d(%d)",&x,&y);
if(count==2)
{
s[i].ac++;
s[i].time+=x+y*m;
}
else if(count==1&&x>0)
{
s[i].ac++;
s[i].time+=x;
}
}
//		getchar();
i++;
}
sort(s,s+i);
for(int j=0;j<i;j++)
printf("%-10s %2d %4d\n",s[j].name,s[j].ac,s[j].time);
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
alicemh 发布了5 篇原创文章 · 获赞 0 · 访问量 136 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: