救济金发放的解决

本文探讨了救济金问题的算法实现,通过模拟人们围坐一圈进行报数并出列的过程,介绍了两种方向的报数方法及其实现细节。同时分享了在调试过程中遇到的问题与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      救济金的问题抽象出来就是几个人围成一个圈坐,给每一个人编号,一个人从1开始,一个人从n开始,从一开始的点到k时,出列一人,n逆时针点人,点到m出列一人。如果我们出列用删除操作,则大大的降低了效率,我们将删除掉的人用0来代替,当我们遇到0时不点人。

     使用两个方法来分别逆时针顺时针点人,如果是0,则跳过


,每一次点相应的人数,这就涉及到我们点到第某人时,某一是0的情况,所以每一次我们点完人,(即某一次点人算数)都要去判断这一次的点人是否有效,也就是是不是点到了正确的人,如果第某次点人,点到的是0,即无效,要向下过滤至有效的一个人。

     转圈,因为一堆人是围着圈坐的,所以当偶们点到最后一个人n时,我们要从新从第一个人开始点名,其中每一次点名都要判断是否我们到达最后一人,同是对于逆时针点人的我们每一次都要判断是否到达队的首端。

 然后做输出。

    在这次的练习中仍然存在的不足有:

    对于vim的分屏操作不熟练,有待加强,对于调试的s,n到底该一次执行一条指令还是多条指令不清楚。调试效率低。

经验:

    对于数数的操作:while(n--)执行的循环次数是n次;

                            当p指向的是当前的位置m时,数k个人后,当前的位置应该是k+m;也就是执行k次循环。

                             当我们点人时从1开始点人的话,点到k人应该是0+k;

                            对于数组的使用我们在实操时往往会选择比题目预设大1;

     今天看了刘老师的解法,可以使用一个方法来实现,我们数数时,在起始位置时,由于是一个圆圈,我们可以设置从一数的时候从最后一个位置起始,从最后位置数数的从起始位置起。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值