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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值