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

题目

某次考试一共八道题(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值