2015编程之美初赛第二场扑克牌

一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。

牌的表示方法为XY,其中X为面值,为2、3、4、5、6、7、8、9、T、J、Q、K、A中的一个。Y为花色,为S、H、D、C中的一个。如2S、2H、TD等。

输入

第一行为一个整数T,为数据组数。

之后每组数据占一行。这一行首先包含一个整数N,表示给定的牌的张数,接下来N个由空格分隔的字符串,每个字符串长度为2,表示一张牌。每组数据中的扑克牌各不相同。

输出

对于每组数据输出一行,形如”Case #X: Y”。X为数据组数,从1开始。Y为可能的方案数,由于答案可能很大,请输出模264之后的值。

数据范围

1 ≤ T ≤ 20000

小数据

1 ≤ N ≤ 5

大数据

1 ≤ N ≤ 52

样例输入

5

1 TC

2 TC TS

5 2C AD AC JC JH

4 AC KC QC JC

6 AC AD AS JC JD KD

样例输出

Case #1: 1

Case #2: 0

Case #3: 48

Case #4: 24

Case #5: 120

思路:(目前只实现小数据)由于要求相邻扑克牌花色不一样,现对其作全排序,再判断是否相邻扑克牌数字一样,若不一样,则计数加一;如有更高效率请各位指点。

#include<iostream>
#include<stdlib.h>
#include<string>
#include<math.h>
#define MAX 52
using namespace std;
long cnt;
void Perm(string pt[],int k,int m)
{
    if(k>m)
    {

        bool flag=true;
        for(int i=1;i<=m;i++)
        {
        if(pt[i].substr(0,1)==pt[i-1].substr(0,1))
            flag=false;
        }
        if(flag==true)
        {
           // for(int i=0;i<=m;i++)
             // cout<<pt[i]<<" ";
            //cout<<endl;
        cnt++;

        }
    }
        else
        {
            for(int i=k;i<=m;i++)
            {

                    //Swap(pt[k],pt[i]);
                    string temp=pt[k];
                        pt[k]=pt[i];
                        pt[i]=temp;
                    Perm(pt,k+1,m);
                    //Swap(pt[k],pt[i]);
                     temp=pt[k];
                        pt[k]=pt[i];
                        pt[i]=temp;

            }
        }
}

//对其排序 只要不重复即可
string pt[MAX];
 int main()
 {
     int T,N;
     cin>>T;
     for(int i=0;i<T;i++)
     {
         cin>>N;
         for(int j=0;j<N;j++)
            cin>>pt[j];
         cnt=0;
         if(N>1)
             Perm(pt,0,N-1);
         else
             cnt=1;
         printf("Case #%d: %ld\n",i+1,cnt);
     }
      return 0;
 }
时间: 2024-08-28 18:06:30

2015编程之美初赛第二场扑克牌的相关文章

编程之美初赛第二场 集合

题目3 : 集合 时间限制:12000ms 单点时限:6000ms 内存限制:256MB 描述 统计满足下列条件的集合对(A, B)的数量: A,B都是{1, 2, -, N}的子集: A,B没有公共的元素: f(A)<= f(B).f(S)定义为S中所有元素的按位异或和.例如, f({}) = 0, f({1, 3}) = 2. 因为答案可能很大,你只需要求出它除以M的余数. 输入 第一行一个整数T (1 ≤ T ≤ 10),表示数据组数. 接下来是T组输入数据,测试数据之间没有空行. 每组数

2015编程之美初赛第一场 A 彩色的树

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, -, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据第一行是n,表示树的节

2015编程之美初赛第一场 C 质数相关

 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二行为N个整数,表示集

编程之美初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个

2015编程之美初赛第一场 B 建造金字塔

 时间限制:4000ms 单点时限:2000ms 内存限制:256MB 描述 在二次元中,金字塔是一个底边在x轴上的等腰直角三角形. 你是二次元世界的一个建筑承包商.现在有N个建造订单,每个订单有一个收益w,即建造此金字塔可获得w的收益.对每个订单可以选择建造或不建造. 建造一个金字塔的成本是金字塔的面积,如果两个或多个金字塔有重叠面积,则建造这些金字塔时重叠部份仅需建造一次. 建造一组金字塔的总利润是收益总和扣除成本.现给出这些订单,请求出最大利润. 输入 输入数据第一行为一个整数T,表示

微软2014编程之美初赛第二场——题目2 : 字符串压缩

[来源] 题目2 : 字符串压缩 [分析] 把游程编码恢复为原始字符串,然后得出每一行的字符串的内容,放在一个vector中.用map统计vector中每一行的反复的次数. 比較两个游程编码得到的map是否同样就可以. 该算法占用空间太多,小数据AC,大数据MLE了. [代码] #include <iostream> #include <string> #include <vector> #include <map> #include <sstream

微软2014编程之美初赛第一场——题目2 : 树

[来源] 题目2 : 树 [分析] 依据输入情况建立起树的模型.树的表示是一个表明父亲节点的数组.核心算法有两个: 计算某一节点的深度.用循环实现,一直向上找父亲节点,直到找到根节点.计算循环的次数即为深度. 计算某一节点的全部子节点.用递归实现. 本题在实现上节点的命名从0至N-1,与题目描写叙述不同. [代码] #include <iostream> #include <vector> using namespace std; vector<int> childre

微软2014编程之美初赛第一场——题目3 : 活动中心

[来源] 题目3 : 活动中心 [分析] 本题採用的是三分法. 输入的一组点中找出左右边界.作为起始边界. while(右边界-左边界<精度){ 将左右边界构成的线段均匀分成3段,推断切割点的距离关系,抹去距离大的一段.更新左右边界. } 输出左(右)边界 [代码] #include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std;

编程之美初赛第一场--焦距

题目1 : 焦距 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 一般来说.我们採用针孔相机模型,也就是觉得它用到的是小孔成像原理. 在相机坐标系下,一般来说,我们用到的单位长度.不是"米"这种国际单位,而是相邻像素的长度.而焦距在相机坐标系中的大小,是在图像处理领域的一个很重要的物理量. 如果我们已经依据相机參数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),