• 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;
    }

     

  • 相关阅读:
    SVG平移和缩放(鼠标滚轮)的实现
    CSS之容器水平垂直居中
    CSS之flex布局
    CSS之鼠标悬停——内容变深/变浅
    CSS之clip-path绘制多边形
    axios
    .Net 反射
    Redis
    .Net Core GRPC报错
    Python 京东云无线宝消息推送
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2476817.html
Copyright © 2020-2023  润新知