救济金的问题抽象出来就是几个人围成一个圈坐,给每一个人编号,一个人从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;
今天看了刘老师的解法,可以使用一个方法来实现,我们数数时,在起始位置时,由于是一个圆圈,我们可以设置从一数的时候从最后一个位置起始,从最后位置数数的从起始位置起。