poj 3629 Card Stacking 模拟
题意: n个人 玩k张牌,你给你上家开始发牌,每发一张,你得把牌首的p张牌放到牌尾去,输出你最终得到的牌的初始位置。
分析:模拟
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn =100100; bool b[maxn]; int a[maxn]; / 当前已经发到第i张牌,返回下一张牌的编号 int GetNextNumber(int i , int p ,int k) { int q = 0; while(q <= p) { i ++; if(i > k) i = 1; if(b[i]) q ++; } return i; } int main() { int n , k , p; int cnt = 0; memset(b , 1 , sizeof(b)); scanf("%d%d%d",&n,&k,&p); int curNumber = 1; b[curNumber] = false; for(int i=2;i<=k;i++) { int nextNumber = GetNextNumber(curNumber , p , k); curNumber = nextNumber; b[curNumber] = false; if(i%n == 0) a[cnt++] = curNumber; } sort(a , a + cnt); for(int i=0;i<cnt;i++) printf("%d\n",a[i]); return 0; }