这个题是华为杯的签到题。。。。我和兔兔做完这个果断跪了。。。。
完美数字感应,中文题。【题意就不用写了的说。。。
其实就是找规律:第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"); } } } } }