【循环报数】

链接:https://www.nowcoder.com/acm/contest/121/D
来源:牛客网

题目描述

    ZQ是一个拥有n女朋友的万人迷,她的每一个女朋友每天晚上都会挨个给他打电话,要他讲了睡前故事才能睡觉。可是,每次他的女朋友都会挑他在吃鸡的时候打电话,ZQ总是因为挂机被舍友赶出宿舍,于是,ZQ告诉他的女朋友们,别打电话了,他会主动打过去给他们讲故事,再打电话就分手!

    于是,ZQ把他的女朋友名字写在纸上,画成一圈,顺时针编号为1~n,然后从1开始顺时针数。在每一次数数中,ZQ数k个就停下来,然后给选中的女朋友打电话讲故事。 

    现在需要你按顺序告诉我们他给女朋友打电话的顺序

输入描述:

先输入一个t,然后t组数据,每行包含两个数字n,k,n<20,k>0

输出描述:

按顺序输出每轮被选中的女朋友的编号。

题解:用队列存储1~n,从1开始报数,当报的次数不是k的倍数,就把队首元素放到队尾。否则出队输出。直到队列为空即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
int main()
{
    int t,n,k;
    scanf("%d",&t);
    while(t--){
        queue<int> q;
        int cnt=0;
        scanf("%d %d",&n,&k);
        for(int i=1;i<=n;i++){
            q.push(i);
        }
        int a[21];
        int j=0;
        while(!q.empty()){
            cnt++;
            if(cnt%k==0){
                a[j++]=q.front();
                q.pop();
            }else{
                int t=q.front();
                q.pop();
                q.push(t);
            }
        }
        for(int i=0;i<j-1;i++){
            printf("%d ",a[i]);
        }
        printf("%d\n",a[j-1]);
    }
    return 0;
}

posted @ 2018-05-13 17:14  神探小小狄  阅读(194)  评论(0编辑  收藏  举报
【推荐】 程序员网址大全  |  EF CodeFirst  |  百度地图.NET  |  MyNPOI  |  开源  |  我的皮肤  |  ASP.NET MVC4  |  前端提升   |  LINQ   |  WCF   |  EasyUI  | aaronyang 页脚html代码