【算法入门】关于结构体的sort函数使用搭配自定义规则cmp

patA1025: 

#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct testee{
    char id[20];
    int l_num;
    int score;
    int local_rank;
}stu[30010];

bool cmp(testee a,testee b)
{
    if(a.score==b.score)return strcmp(a.id,b.id)<0;
    else return a.score>b.score;
}
int main()
{
    int N,k,num=0;
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
    {
        scanf("%d",&k);
        for(int j=0;j<k;j++)
        {
            scanf("%s%d",stu[num].id,&stu[num].score);
            stu[num].l_num=i;
            num++;//总数
        }
        sort(stu+num-k,stu+num,cmp);
        stu[num-k].local_rank=1;
        for(int p=num-k+1;p<num;p++)
        {
            if(stu[p].score==stu[p-1].score){
                     stu[p].local_rank=stu[p-1].local_rank;
            }
            else {
                     stu[p].local_rank=p+1-(num-k);
            }
        }
    }
    sort(stu,stu+num,cmp);
    int final_rank=1;
        printf("%d\n",num);
        for(int p=0;p<num;p++)
        {
            if(p>0&&stu[p].score!=stu[p-1].score)
           final_rank=p+1;
            printf("%s %d %d %d",stu[p].id,final_rank,stu[p].l_num,stu[p].local_rank);
            if(p!=num-1)printf("\n");
        }

    return 0;
}

注意:

使用一个结构体表示学生即可,里面的成员变量只需要设置题目中需要输出的四个中的三个(最后排名可以不放在里面),再增加一个输入的分数,即可。

主要思想:

利用结构体+sort函数,自定义结构体比较的规则cmp

(别忘记头文件<algorithm>和using namespace std,这个是C++的函数)

比较的规则:根据题意来即可,相同分数按照学号升序,不同学号按照分数升序。

因为要输出排名,所以排完序还要给定排名,(因为有可能出现排名相同的)。注意相同排名虽然排名一样,但是下一个人不是从他们相同的排名开始的,是根据在自己前面有多少人。具体实现用for循环中的循环变量表示排名(可能是i+1),如果相同,排名和前面的相等,不同则等于自己所在下标+1。

在保存输入数据的时候,需要二层for循环,外层的循环表示有几个班级,内层循环表示一个班级里面有多少人,然后挨个输入他们的信息。

在内层循环每次结束的时候,就已经可以按照题目要求,计算出每个班级的内部排名了,这个时候最好尽量减少设置多余的变量来表示他们的关系,通过内层for循环中的变量,和输入的人员数目,还有在循环开始前定义的所有人数的计数器,就可以表示每次从哪个值开始到哪个值结束去排序了。

比如每次班级排序是从stu+num-k开始到stu+num结束

 

除此之外还要注意的是,在二层循环结束后,所有的学生信息都存在了学生结构数组中了,结束的位置下标是num-1。

然后再进行排序,得出题目要求输出的最终排序,这个可以不用存下来,因为他就是遍历所有存储的数组中的学生数据,和输出一样都是需要一个for循环。

所以可以边获得变输出题目要求的那些东西。

还要注意的是,和内层每个班级的那个排序一样,排序完要重新给定排名,不可以直接按照数组的下标,因为可能出现相同排名的人。

这个点要注意,自己一开始就是这里卡壳了很久。

应该还是自己做题太少,不熟练,思维不清晰。

以上注意的点在写的时候应该自然而然就发现了。

只要记得关键的是要用到数组、sort、自定义规则就好了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值