📋 个人简介
📣取牌游戏
【问题描述】
🍋小明正在使用一堆共 K 张纸牌与 N-1 个朋友玩取牌游戏。其中,N≤K≤100000,2≤N≤100N≤K≤100000,2≤N≤100,K 是 N 的倍数。纸牌中包含M=K/NM=K/N张“good”牌和K−MK−M 张“bad”牌。小明负责发牌,他当然想自己获得所有“good”牌。
🍋他的朋友怀疑他会欺骗,所以他们给出以下一些限制,以防小明耍诈:
🍊游戏开始时,将最上面的牌发给小明右手边的人。
🍊每发完一张牌,他必须将接下来的 P 张牌(1≤P≤101≤P≤10)一张一张地依次移到最后,放在牌堆的底部。
🍊以逆时针方向,连续给每位玩家发牌。
小明迫切想赢,请你帮助他算出所有“good”牌放置的位置,以便他得到所有“good”牌。牌从上往下依次标注为 #1,#2,#3,…
【输入格式】
🍋第 1 行,3 个用一个空格间隔的正整数 N、K 和 P。
【输出格式】
🍋M 行,从顶部按升序依次输出“good”牌的位置。
【输入样例】
3 9 2
【输出样例】
3
7
8
💯CODE
#include<bits/stdc++.h>
//#include<iostream>
//#include<queue>
//#include<algorithm>
using namespace std;
queue<int>q;
int a[100005],tot=0;
int main()
{
int n,k,p;
cin>>n>>k>>p;
int m,i,j;
m=k/n;
for(i=1;i<=k;i++)
q.push(i);//push 进队
int x,y;
y=1;
while(!q.empty() /*q.size()*/)//队不空 0是false 非0是true
{
x=q.front() ;//取队首
q.pop();//出队
y--;
if(y==0) y=n;
if(y==1) a[++tot]=x;//good
for(j=1;j<=p;j++){
x=q.front() ;//取队首
q.pop();//出队
q.push(x);//进队
}
}
sort(a+1,a+tot+1);
for(i=1;i<=tot;i++)
{
cout<<a[i]<<endl;
}
return 0;
}