现在的位置: 首页 > 综合 > 正文

seuoj 110 完美数字感应

2017年11月23日 ⁄ 综合 ⁄ 共 742字 ⁄ 字号 评论关闭

这个题是华为杯的签到题。。。。我和兔兔做完这个果断跪了。。。。

完美数字感应,中文题。【题意就不用写了的说。。。

其实就是找规律:第n(n从0开始)张卡片的第1个数是2^n,其余的数跟据其可由哪些2^k组成,则该数出现在哪个卡片上,比如3=2+1=2^1+2^0,则3出现在第0和1张卡片上,再比如说15吧,15=1+2+4+8=2^0+2^1+2^3+2^4,就是第0,1,2,3张卡片上。做法就是把数转化成二进制就对啦。。。。。然后位数是1则这一位对应的卡片上有这个数,如果是0就没有了。下面是AC代码【没有做过什么优化。。。。代码不优雅。。。

#include <cstdio>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int card[8193][14];
int n;

void solve()
{
    int i,j;
    for(i=1;i<=8192;i++)
    {
        int x=i;
        for(j=1;j<=13;j++)
        {
            if(x==0)
                break;
            card[i][j]=x%2;
            x/=2;

        }
    }

}
int main()
{
    int i,j,k;
    solve();
    int casen;
    scanf("%d",&casen);
    while(casen--)
    {
        scanf("%d",&n);
        for(int j=1;j<=n;j++)
        {
            for(i=1;i<pow(2,n);i++)
            {
                if(card[i][j]==1)
                {
                    printf("%d ",i);

                }
                if(i==pow(2,n)-1)//因为n个卡片,最大的数是2^n-1,这个数转换成二进制是111^11(n个1)即每张卡片的最后一个数都是这个数
                {

                    printf("\n");
                }
            }
        }

    }

}

【上篇】
【下篇】

抱歉!评论已关闭.