pat甲级1012rank思路最清晰总结自我复盘

参考了柳神的代码进行分析。

1.这道题我一开始想的是,创捷一个结构体student,体内有每个学生的A,C,M,E成绩,以及每个成绩的排名,但这样就会出现一个问题,就是排序的时候,要写四个排序函数。柳神用数组来存储排名和成绩,flag来表示当前排名的成绩,有利于for循环的表达,而且只需要用一个排序函数。

2.这道题我也在想如何排名,首先排名肯定是不能只排一次一劳永逸的,因为要取最好的排名,那必须要把A,B,C, E四个成绩都排一下。那就循环表达式很明显,四个成绩,进行排名,关于这个cmp函数,运用全局变量flag,排完一次flag++,代表进入score[flag++],下一个成绩的排名。

3.名是排好了,但是排好顺序后要记录每个学生的排名(因为每一次的排序规则不一样,所以要开辟rank[4]数组,及时记录好排名),排名的函数也很有讲究,stu[i].score[0] == stu[i -1].score[0],这种情况是出现了并列的情况,就让stu[i].rank[flag] = stu[i -1].rank[flag];但是要注意一个学生的stu[i].rank[flag] = i+1的(i++); (比如 1 1 1 4 5 6 6 8);很明显这里也有一个循环,首先是要循环四次对A C M E四科成绩都要排一遍,第二点是有n个同学for循环要有n次;                                            总结一下就是: 4科成绩最外层循环,进入循环后进行当前的flag成绩的cmp函数排序,排完序后要for循环n次记录n个学生的stu[i].rank[flag] = i +1(存储记录下排名)。

4.记录好每一个学生每一科的排名后,就要开始寻找当前学生的最佳的排名。也是进行for循环n次,然后对stu[i].rank[i]四科成绩的排名进行一个比较,记住!这里不需要去记录每个学生最佳排名对应的名词(开辟一个数组单独记录也可以),因为本来在第三步中已经记录了当前学生的每个成绩的排名,我们只需要记录当前学生的最佳排名的对应科目就好了,而且这个科目是对应的rank数组的0,1,2,3下标,后面我们再根据最佳科目查询就能得到最佳科目的最佳排名了。

5.这里也是最重要的一点,我一直在想的一点,就是我没有通过数组的下标去对应stu.id,每一个学生是用的stu[i].id; 那怎么去查询id呢?exist[stu[i].id] = i + 1;实际上也要通过数组下标去查询,柳神单独开辟了一个exist[10000]数组去存储下标对应stu[i - 1];并且可以通过exist > 0来判断当前学生在不在。那这里可不可以直接一开始就用stu[id]作为数组下标对应id呢?如果这样的话,首先,stu应该是一个stu[10000]的数组,会出现stu[10000]有这个人,stu[33333]又才有人,其余数组是空的情况,在排序函数的时候呢,就又需要创建新的flag1.flag2++去记录人数排名(因为之前直接是循环i++,i来记录排名)(而且有个判断条件就是确保stu[36663].score > 0)。所以其实两种方法都可以,柳神单独开辟了一个数组来对应id,我这种做法要单独开辟flag1++去记录排名人数。

6.暂时想到这么多,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值