题解 | #ZQ的睡前故事#

ZQ的睡前故事

https://ac.nowcoder.com/acm/problem/15896

考察重点:约瑟夫环

首先根据题意,从1开始顺时针数,数到k个就停下并输出当前对应数字,很明显,重点是在循环中找到所需的数字,且不能重复选择已选择过的数字不可以花心哦  ̄へ ̄)

以 n=10,k=3 为例,前面输出 3,6,9不作多过赘述,按照题意,从9重新开始循环至2(10->1->2),那么,接下来从2开始,应该是5才对;但为什么接下来是7呢?很简单,因为你之前已经输出过3和6了(意味着你已经给三女友和六女友打过电话了,没必要再打一遍,搞区别对待小心被甩(bushi)),所以之后正确的输出应该是:2->3(pass)->4->5->6(pass)->7,所以下一个要打给7,以此类推

理清思路后就简单了,附上ac代码(∠ • ω <)~☆

#include <stdio.h>

int main() {
    int t;
    scanf("%d", &t);
  
    for (int i = 0; i<t; i++) {
      
        int n, k;
        scanf("%d %d", &n, &k);
      
        int arr[n];
        for (int j = 0; j < n; j++) {
            arr[j] = 0;
        }//初始化列表
      
        int start = 0;
        for (int j = 0; j < n; j++) {
            int count = 0;
            while (count < k) {    
                start = (start + 1) % n;
                if (arr[start] != 1) {
                    count++;//已经排除的不会算在循环里
                }
            }
          
            if (start == 0) {
                printf("%d ", n);//如果正好可以被整除,说明此时就是n
            }
            else {
                printf("%d ", start);//反之则是对应数字
            }
          
            arr[start] = 1;//别忘了排除已选过的数字
        }
      
        printf("\n");
    }

    return 0;
}

就到这了,希望对你有所帮助,bye~

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务