HDU 2093 考试排名

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093

本题即为字符串处理以及sscanf函数以及排序的应用.

sscanf函数的应用对此题有了很大帮助,方便快捷的得到字符串中的整形数据。

要先对姓名按字典排序,以应对AC的题数和罚时都相同的情况。

AC代码:

 

#include<iostream>
using namespace std;
#include<string.h>
char s[1000][15]={0};
int A[1000]={0},B[1000]={0};
int main()
{
    //freopen("d:\\1.txt","r",stdin);
    int n,m,i,j,l;
    int k=0;
    cin>>n>>m;
    char name[15],score[15][15],temp[15];
    int t;
    while(scanf("%s",name)!=EOF)
    {
        int punish=0,k1=0;//punish代表罚时 k1代表AC题的个数
        int a,b;
        
        strcpy(s[k],name);
        for(i=0;i<n;i++)//依次输入每个题的解题情况
        {
            int p1=1,p2=1;
            scanf("%s",score[i]);
            l=strlen(score[i]);
            for(j=0;j<l;j++)
             if(score[i][0]=='-'||score[i][0]=='0'){p1=0;break;}
             else if(score[i][j]=='('){p2=0;break;}
            if(p1)
            {
                if(p2)
                {
                    sscanf(score[i],"%d",&a); //sscanf
                    punish+=a;                             
                }
                else
                {
                    sscanf(score[i],"%d(%d)",&a,&b);//sscanf
                    punish=punish+a+b*m;        
                }
                 k1++;
            } 
            
        }//for
        A[k]=k1;
        B[k]=punish;
        
        k++;//计算学生的数目
    }//while
    //接下来是排序  在此可以先测试一下输出结果 来判断做的是否正确
    
     for(j=k-1;j>=0;j--)//j=k-1而别错写成n-1
      for(i=0;i<j;i++)
      {
          if(strcmp(s[i],s[i+1])>0)//先按名字字典排序
           {
               strcpy(temp,s[i]);
               strcpy(s[i],s[i+1]);
               strcpy(s[i+1],temp);
               t=A[i];
               A[i]=A[i+1];
               A[i+1]=t;
               t=B[i];         //真是的  把t错定义成char型的了  所以排序会出错
               B[i]=B[i+1];
               B[i+1]=t;
           }    
      }
      for(j=k-1;j>=0;j--)//再按AC的题数从大到小排序
       for(i=0;i<j;i++)
       {
           if(A[i]<A[i+1])
           {
               strcpy(temp,s[i]);
               strcpy(s[i],s[i+1]);
               strcpy(s[i+1],temp);
               t=A[i];
               A[i]=A[i+1];
               A[i+1]=t;
               t=B[i];         
               B[i]=B[i+1];
               B[i+1]=t;
           }    
       }
       for(j=k-1;j>=0;j--)
       for(i=0;i<j;i++)
       {
           if(B[i]>B[i+1]&&A[i]==A[i+1])//按罚时从小到大排序
           {
               strcpy(temp,s[i]);
               strcpy(s[i],s[i+1]);
               strcpy(s[i+1],temp);
               t=A[i];
               A[i]=A[i+1];
               A[i+1]=t;
               t=B[i];         
               B[i]=B[i+1];
               B[i+1]=t;
           }    
       }
     
    //输出最后结果
    for(i=0;i<k;i++)
     {
         printf("%-10s %2d %4d",s[i],A[i],B[i]);
         cout<<endl;
     }
    
    return 0;
}

 

 

 

posted @ 2012-04-30 11:23  龙杉老师  阅读(427)  评论(0编辑  收藏  举报