Perfect Shuffles

定制扑克牌排序算法
本文介绍了一种通过输入特定数值来定制扑克牌排序的方法。该算法利用二进制位操作,根据输入数值的不同,选择不同的排序规则(out或in方式),从而实现扑克牌的个性化排序。这种排序方式为扑克牌游戏提供了多样化的玩法。

想洗成什么样就洗成什么样的扑克牌

通过计算一个序数的二进制决定使用out 还是in 方式

哈哈

// Inf3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"


int main(int argc, char* argv[])
{
 int k[2][26],r,c,bin[8],n,m,g[52],j;
 for(c=0;c<26;c++)
 {
  k[0][c]=c;
  k[1][c]=c+26;
 }
 printf("Bitte geben Sie N ein!/n");
 scanf("%d",&n);
 for(m=0;m<8;m++)
  bin[m]=0;
 for(m=7;m>=0;m--)
 {
  bin[m]=n%2;
  n=n/2;
  if(n==1)
  {
   bin[m-1]=1;
   break;
  }
 }
 for(m=0;m<8;m++)
 {
  j=0;
  printf("%d ",bin[m]);
  switch(bin[m])
  {
   case 0:
    for(c=0;c<26;c++)
    {
     for(r=0;r<2;r++)
     {
      g[j]=k[r][c];
      j++;
     }
    }
    break;
   case 1:
    for(c=0;c<26;c++)
    {
     for(r=1;r>=0;r--)
     {
      g[j]=k[r][c];
      j++;
     }
    }
    break;
  }
  for(c=0;c<26;c++)
  {
   k[0][c]=g[c];
   k[1][c]=g[c+26];
  }
 }
 printf("/n");
 for(r=0;r<2;r++)
 {
  for(c=0;c<26;c++)
  {
   printf("%2d ",k[r][c]);
  }
  printf("/n");
 }
 return 0;
}

 

# T643023 R6 - B 打扑克 ## 题目背景 ~~寝室里打牌氛围超棒的说~~ ## 题目描述 小 Z 得到了 $n$ 张扑克牌,这 $n$ 张牌的编号为 $1,2,\cdots ,n$,接下来小 Z 会对其进行“洗牌”操作,具体步骤如下: - 将 $n$ 张牌按顺序叠放在桌子上,编号从上到下依次递增。另外还有一堆已洗完的牌,初始为空。 - 选择 $1$ 个正整数 $k(1\le k\le n)$,选择 $k+1$ 个整数 $x_0,x_1,x_2,\cdots ,x_{k-1},x_k(0=x_0< x_1<x_2<\cdots<x_{k-1}<x_k=n)$,然后将这叠牌切分成 $k$ 堆,第 $i$ 个部分为编号在 $(x_{i-1},x_i]$ 中的所有牌。例如当 $n=7$ 时,小 Z 可以选择将这些牌切分为三个部分 $\{1,2,3\},\{4,5\},\{6,7\}$。注意,在切分完之后,每一堆牌仍然保持着编号从上到下依次递增的性质。 - 将这 $k$ 堆牌以任意顺序排成一行。 - 从左到右不断进行观察,如果当前牌堆中仍有牌,则取出最上面的一张放到已洗完的牌堆**底部**。重复操作直到所有牌均被放入已洗完的牌堆。 为了更好地理解洗牌的过程,下面是一个具体的例子: - $n=8$,初始牌堆为 $\{1,2,3,4,5,6,7,8\}$。 - 选择 $k=3$ 并切分牌堆为三个部分 $\{1,2,3\},\{4,5\},\{6,7,8\}$。 - 将这三堆牌排成一行 $\{4,5\},\{6,7,8\},\{1,2,3\}$。 - 从左到右第一轮,取出的牌为 $4,6,1$,已洗完的牌堆为 $\{4,6,1\}$,三堆牌剩余为 $\{5\},\{7,8\},\{2,3\}$。 - 从左到右第二轮,取出的牌为 $5,7,2$,已洗完的牌堆为 $\{4,6,1,5,7,2\}$,三堆牌剩余为 $\emptyset,\{8\},\{3\}$。 - 从左到右第三轮,取出的牌为 $8,3$,已洗完的牌堆为 $\{4,6,1,5,7,2,8,3\}$,三堆牌均为空,洗牌结束。 现在小 Z 拿到了最终已洗完的牌堆从上到下的编号,他想知道有多少种不同的洗牌方式使得最终能得到这个顺序。 称两种洗牌方式不同,当且仅当两种洗牌方式中的切分出的牌堆个数,牌堆切分方式,牌堆排列顺序有任意一个是不同的。 小 Z 还会给出 $q$ 次操作,每次操作会交换排列中两个位置的数,并请你回答上述问题。 ## 输入格式 **本题包含多组数据** 第一行包含一个正整数 $T$,表示数据组数。 接下来 $T$ 组数据,每组数据第一行包含两个正整数 $n,q$,含义如上。 第二行包含 $n$ 个正整数,表示一个 $1,2,\cdots,n$ 的排列。 接下来 $q$ 行,每行包含两个正整数 $x,y$,表示交换这两个位置的数。 ## 输出格式 对每组数据,输出 $q+1$ 行整数,分别表示初始情况和每次操作结束后的答案。 ## 输入输出样例 #1 ### 输入 #1 ``` 2 4 3 1 3 2 4 1 2 2 3 1 4 5 5 1 4 3 2 5 2 3 1 3 4 2 5 1 4 3 ``` ### 输出 #1 ``` 3 2 2 2 3 3 2 2 3 2 ``` ## 说明/提示 #### 样例输入/输出 2 详见下发文件下的 ex_poker2.in/out。 这个数据满足第 $1,2,3$ 个测试点的限制。 #### 样例输入/输出 3 详见下发文件下的 ex_poker3.in/out。 这个数据满足第 $4,5,6$ 个测试点的限制。 #### 数据规模与约定 对所有数据,保证 $1\le T\le 3,1\le n\le 10^5,1\le q\le 1.5\times 10^5,x\not=y$。 | 测试点编号 | $n\le$ | $q\le$ | | ---------- | ------ | ---------------- | | $1,2,3$ | $200$ | $300$ | | $4,5,6$ | $2000$ | $3000$ | | $7,8,9,10$ | $10^5$ | $1.5\times 10^5$ |
最新发布
07-31
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值