n 个小朋友围成一圈,玩数数游戏。
小朋友们按顺时针顺序,依次编号为 1~n。
初始时,1 号小朋友被指定为领头人。
游戏一共会行进 k 轮。
在第 i 轮中,领头人会从他的顺时针方向的下一个人开始,按顺时针顺序数 ai 个人。
其中,最后一个被领头人数到的人被淘汰出局,这也意味着该轮游戏结束。
出局者的顺时针方向的下一个人被指定为新领头人,引领新一轮游戏。
例如,假设当游戏即将开始第 i 轮时,还剩下 5 个小朋友,编号按顺时针顺序依次为 8,10,13,14,16,并且当前领头人为 13 号小朋友,ai=12,则第 i 轮游戏结束后,最后一个被数到的小朋友为 16 号小朋友,他将被淘汰出局,并且处于其下一位的第 8 号小朋友将被指定为新领头人。
现在,请你求出每一轮次被淘汰的小朋友的编号。
输入格式
第一行包含两个整数 n,k。第二行包含 k 个整数 a1,a2,…,ak。
输出格式
一行,k 个整数,其中第 i 个整数表示在第 i 轮中被淘汰的小朋友的编号。数据范围
前三个测试点满足 2≤n≤10。
所有测试点满足 2≤n≤100,1≤k≤n,1≤ai≤109。输入样例1:
7 5
10 4 11 4 1
输出样例1:
4 2 5 6 1
输入样例2:
3 2
2 5
输出样例2:3 2
刚开始通过循环队列模拟,时间超时!!!!!!
#include <iostream>
using namespace std;
int a[105];
struct Node{
int data;
Node *next;
};
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
Node *p,*q,*first;
first=new Node;
p=first;
first->data=1;
for(int i=2;i<=n;i++)
{
q=new Node;
q->data=i;
p->next=q;
p=p->next;
}
p->next=first;
p=first;
for (int i=1;i<=k;i++)
{
//模拟数数
for(int j=1;j<a[i];j++)
{
p=p->next;
}
//找到输出删除q节点
q=p->next;
p->next=q->next;
p=p->next;
cout<<q->data<<" ";
delete q;
}
return 0;
}
然后看了y总的方法,通过队列模拟
#include <iostream>
#include <queue>
using namespace std;
queue <int> d;
int n,k;
int main()
{
cin >> n >> k;
队列进队
for(int i = 1; i <= n; i++) d.push(i);
//进行k次
while(k--)
{
int a;
cin >> a;
a=a%d.size();//取模减少运算
for (int i = 1; i <= a; i++ )
{
//将队头元素放入队尾
d.push(d.front());
//删除队头元素
d.pop();
}
//输出目标,删除目标
cout << d.front() << " ";
d.pop();
}
return 0;
}