zoukankan      html  css  js  c++  java
  • 杭电OJ-2093_考试排名

    考试排名

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 10800    Accepted Submission(s): 3825


    Problem Description
    C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
    我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。
    例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:



    若每次错误提交的罚分为20分,则其排名从高到低应该是这样的:
    Josephus 5 376
    John 4 284
    Alice 4 352
    Smith 3 167
    Bob 2 325
    Bush 0 0
     

    Input
    输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。

     

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

    Sample Input
    8 20 Smith -1 -16 8 0 0 120 39 0 John 116 -2 11 0 0 82 55(1) 0 Josephus 72(3) 126 10 -3 0 47 21(2) -2 Bush 0 -1 -8 0 0 0 0 0 Alice -2 67(2) 13 -1 0 133 79(1) -1 Bob 0 0 57(5) 0 0 168 -7 0
     

    Sample Output
    Josephus 5 376 John 4 284 Alice 4 352 Smith 3 167 Bob 2 325 Bush 0 0
     

    题目不难,但是烦。

    开始时以为只有6个人,有多组题目数不同的数据。其实只有一组n,m,学生数据输到EOF。

    windows下在新的一行开头Ctrl-Z表示EOF

    Linux下在新的一行开头Ctrl-D表示EOF(Ctrl-Z表示将程序挂起,用fg命令+Ctrl-C来结束)

    代码

    #include<iostream>
    #include<cmath>
    #include<iomanip>
    #include<cstring>
    using namespace std;
    int n,m,person;
    struct stu
    {
    	char name[256][20];
    	int ac;
    	int time;
    };
    
    int change(char *score)
    {
    	int i,sum=0,erro1,erro2,errosum=0;
    	if(score[0]>'0'&&score[0]<='9')
    	{
    		for(i=0;;i++)			//数字个数
    		{
    			if(score[i]=='('||score[i]=='')
    			{
    				if(score[i]=='(')	            //错误次数
    				{
    					erro1=i+1;
    					for(int j=i+1;;j++)
    					if(score[j]==')')
    					{
    						erro2=j-1;			
    						break;
    					}	
    					for(int j=erro2,jj=0;j>=erro1;j--,jj++)
    						errosum+=(score[j]-48)*pow(10,jj);
    				}
    				break;
    			}
    		}
    		for(int j=i-1;j>=0;j--)			          //用时
    		{
    			sum+=(score[j]-48)*pow(10,i-1-j);
    		}
    		return sum+errosum*m;
    	}
    	else
    		return 0;
    }
    
    void work(stu *p)
    {
    
    	for(int i=0;i<person;i++)
    	{
    		p[i].ac=0;	      //ac 题数
    		p[i].time=0;	    //总时间
    		for(int j=1;j<n+1;j++)
    		{
    			if(change(p[i].name[j])>0)
    			{
    				p[i].ac++;
    				p[i].time+=change(p[i].name[j]);
    			}				
    		}
    	}
    }
    
    void sort(stu *p)
    {
    	for(int i=0;i<person;i++)		//ac次数排序
    	for(int j=0;j<person-1-i;j++)
    		if(p[j].ac<p[j+1].ac)
    			stu a=p[j];p[j]=p[j+1];p[j+1]=a;
    	for(int i=0;i<person;i++)		//时间排序
    	for(int j=0;j<person-1-i;j++)
    		if(p[j].time>p[j+1].time&&p[j].ac==p[j+1].ac)
    				stu a=p[j];p[j]=p[j+1];p[j+1]=a;
    	for(int i=0;i<person;i++)		//名字字典排序
    	for(int j=0;j<person-1-i;j++)
    		if(strcmp(p[j].name[0],p[j+1].name[0])>0&&p[j].time==p[j+1].time&&p[j].ac==p[j+1].ac)
    				stu a=p[j];p[j]=p[j+1];p[j+1]=a;
    }
    
    void input(stu *p)
    {
    	int i=0;
    	person=0;
    	while(cin>>p[i].name[0])
    	{
    		person++;
    		for(int j=1;j<n+1;j++)
    			cin>>p[i].name[j];
    		i++;
    	}
    }
    
    void output(stu *p)
    {
    	for(int i=0;i<person;i++,cout<<endl)
    	{
    		cout<<setw(10)<<left<<p[i].name[0]<<' '
    			<<setw(2)<<right<<p[i].ac<<' '
    			<<setw(4)<<right<<p[i].time;
    	}
    }
    
    int main()
    {
    	stu stuc[1000];
    	cin>>n>>m;
    		input(stuc);
    		work(stuc);
    		sort(stuc);
    		output(stuc);
    		
    	
    }


  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/A-yes/p/9894241.html
Copyright © 2011-2022 走看看