poj 3629 Card Stacking 模拟

题意: n个人 玩k张牌,你给你上家开始发牌,每发一张,你得把牌首的p张牌放到牌尾去,输出你最终得到的牌的初始位置。

分析:模拟

View Code
#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;
}
posted @ 2012-07-03 14:18  lenohoo  阅读(539)  评论(0编辑  收藏  举报