1025 PAT Ranking (25分)

 

#include
#include
#include
using namespace std;


struct student{
    char name[10];
    char id[15];
    int score;
    int location_number;
    int local_rank;
}stu[30010];
//

bool cmp(student a,student b)
{
    if(a.score!=b.score)return a.score>b.score;//若真返回 1
    else return strcmp(a.id,b.id)<0;
    
}

int main()
{
    int n,k,num=0;//考场数  考场内人数k  总人数num 
     
    scanf("%d",&n);//输入考场数
    
    //枚举
    for(int i=1;i<=n;i++)//考场数目i 
    {
        scanf("%d",&k);
        for(int j=0;j){
        
            scanf("%s %d",stu[num].id,&stu[num].score);
            stu[num].location_number=i;
            num++;//当num不被赋值给其他数的时候  num++和++num都一样。 
        
        
        }
        
        sort(stu+num-k,stu+num,cmp) ;
        stu[num-k].local_rank=1;//对第一名  PS:因为数组下标为0的特殊? 
        //对剩余考生
        for(int j=num-k+1;j)
        {
            if(stu[j].score==stu[j-1].score)//分数相当时候 
            {
                stu[j].local_rank=stu[j-1].local_rank;
            }
            else
            {
                stu[j].local_rank=j+1-(num-k);
            }
            
         } 
        
     } 
    printf("%d\n",num);
    sort(stu,stu+num,cmp);  //数组不用加下标的情况  sort(,,);
    
    int r=1; 
    for(int i=0;i//输出同类型 即 输出很多一样样式的数据    。肯定第一个考虑枚举呀 
    {
        if(i>0&&stu[i].score!=stu[i-1].score){
            r=i+1;        //保证 :r不会因为跳过去缺少的数,导致 如:1 2 2 (缺少三)4 变为 1 2 2 3 
        }
    //    cout<
        printf("%s ",stu[i].id);
        printf("%d %d %d\n",r,stu[i].location_number,stu[i].local_rank);
        
        
    } 
    return 0;
}

 

你可能感兴趣的:(1025 PAT Ranking (25分))