oj系统排名

评测系统排名

  • 题目要求:例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。

  • 输入输出:输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。

    Output
    根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。

  • 解题思路:自定义结构体s,记录学生姓名,答对的题数以及罚时长短。将数组开大防止数据量过大数组越界,cmp函数用于排序,做对题目数num用降序,罚时time用升序。

    输入的数据中,姓名为字符串类型用string,输出时固定长度为10位,输入数据的情况有三种,一种是0或者小于0的整数表示该题目未通过,不需要计算;第二种是大于0的整数,代表该题通过测试的时间;第三种是一个正整数加上一个括号,括号内的数代表错误次数。将每个人所有的题的得分存进一个字符串数组,数组长等于题目数,定义count作为计数器,记录通过的题目数。

    利用循环结构每次从字符串数组中提取一个字符串,length函数记录字符串长,从第一个字符开始遍历如果是大于0小于等于9的数计数器加1,每次前一位乘10加1计算时间,遇到“(”时从括号下一位开始计算错误次数,遇到“)”结束,乘上罚时加上通过时间等于罚时总长,将姓名、题数和时间记录在结构体数组,调用sort进行排序后输出。

  • 代码实现

#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;

struct S
{
	string name;
	int num,time;
}sdu[20000];

bool cmp(struct S a,struct S b) 
{
	if(a.num!=b.num)
		return a.num>b.num;
	else
	{
		if(a.time!=b.time) 
			return a.time<b.time;
		else
			return a.name[0]<b.name[0];
	} 
}


int main()
{
	int a,b;
	cin>>a>>b;
	string name;
	int ii=0;
	while(cin>>name)
	{
		sdu[ii].name=name;//姓名 
		//cout<<sdu[ii].name;
		string *pro=new string[a];//存储八个题的分数 
		for(int j=0;j<a;j++)
		{
			cin>>pro[j];
		}
		
		int count=0,tt=0; 
		for(int j=0;j<a;j++)
		{
			int length=pro[j].length();
			if(pro[j][0]>'0'&&pro[j][0]<='9')
			{
				int time=0;
				char pp;
				for(int k=0;k<length;k++)
				{
					if(pro[j][k]=='(') break;
					pp=pro[j][k];
					time=time*10+(pp-'0');
				}
				count++;
				tt=tt+time;
			}
			
			for(int k=0;k<length;k++)
			{
				if(pro[j][k]=='(')
				{
					int time=0;
					for(int u=k;u<length;u++)
					{
						char m=pro[j][u+1];
						if(m==')') break;
						time=time*10+(m-'0');
					}
					tt=tt+time*b;
				}
			}
			
		}
		//cout<<"aaaaa";
		sdu[ii].num=count;//答对的题的数目
		sdu[ii].time=tt;//罚时 
		ii++;	
	}
	
	sort(sdu,sdu+ii,cmp);
	//cout<<"aaaaa"<<ii<<endl;;
	for (int i = 0; i <ii; i++)
	{
		cout<<setiosflags(ios::left)<<setw(10)<<sdu[i].name<<" ";
		cout<<setiosflags(ios::right)<<setw(2)<<sdu[i].num<<" ";
		cout<<setiosflags(ios::right)<<setw(4)<<sdu[i].time<<endl;
		cout << resetiosflags(ios::right);
	//	cout<<"bbbbbb";
	}
	
	
}

发布了19 篇原创文章 · 获赞 0 · 访问量 659

猜你喜欢

转载自blog.csdn.net/Hdjjdsbjj/article/details/104631041
OJ