spoj 1108

要求输出一个牌的顺序 使每隔1、2、.....、n翻牌后出现1 2 3 4 5 6 7 8 9 .... n

将牌想象成n个空格  正向推 空n个位置放n 循环 需优化

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define maxn 30000

using namespace std;

int a[maxn],n;

int fff(int b, int t ,int c)
{
    int j = 0;
    while(1)
    {
        if(c == n)
            c = 0;
        if(!a[++c])
            j++;
        if(j == b)
            break;
    }
    a[c] = t;
    return c;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int b = 0;
        int c = 0;
        memset(a, 0, sizeof(a));
        for(int i = 0; i < n; i++)
        {
            b = n-i;
            c = fff((i+1)%b+1, i+1, c);
        }
        for(int i = 1; i < n; i++)
        {
            printf("%d ",a[i]);
        }
        printf("%d\n",a[n]);
    }
    return 0;
}


posted @ 2013-07-26 21:01  xlc2845  阅读(105)  评论(0)    收藏  举报