链接:
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;
}