POJ 3629
基本描述:
有N个人在玩K张牌,每次抽完一张牌后将之后的P张牌放在队尾,要判断其中一个人的牌。这个人出于最下家(第n个拿牌的人)
输入:
N K P
输出:
他拿到的牌的位置(升序输出)
思路:利用队列 STL完成
#include <cstdio>
#include <queue>
#include <list>
#include <algorithm>
using namespace std;
void print(int i)
{
printf("%d\n",i);
}
int main()
{
int n,k,p;
list<int> l; //利用链表存储作弊的牌的位置
while(scanf("%d%d%d",&n,&k,&p)!=EOF)
{
l.clear();
int i,j,count=1;
queue<int> q;
for(i=1;i<=k;i++)
q.push(i);
while(!q.empty())
{
if(count%n==0)
l.push_back(q.front()); //将队头的元素放至链表中
q.pop();
count++;
for(j=0;j<p;j++) //将之后的牌放到队尾
{
q.push(q.front());
q.pop();
}
}
l.sort();
for_each(l.begin(),l.end(),print);
}
return 0;
}