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;

}

 

 

 

你可能感兴趣的:(HDU)