一、题意

随机给你一堆牌(标准扑克牌),之后让你按照:
  第一优先规则:所有相同花色的在一起

  第二优先规则:所有相同花色的必须按照升序或者降序排列

问,你最少要拿出多少张牌插入到其他的地方以维持这个状况?

二、做法

考虑,4种花色,因而排列有A44(24种);

考虑升降续组合,为2^4=16种

因而所有合法最终状态共有24*16种状态,因而可以进行枚举。

对于变化次数有,n-LCS(i);

故,枚举取最大即可。

最大时间复杂度为:
52*52+14*16*52*log52;

(因为最大卡牌数量为52)

三、代码

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define veci vector<int>
#define pp pair<ll,ll>
#define vecp vector<pp> const ll MAXN=233;
int c[]={'c','h','s','d'};
bool state[4];
char control[24][4];
vector<char> que;
int times=0; const int ENDD=16;
void dfs(int dep)
{
if(dep == 4)
{
int len=que.size();
for(int i=0;i<len;++i)
{
control[times][i]=que[i];
}
times++;
}else{
for(int i=0;i<4;++i)
{
if(state[i]==0)
{
state[i]=1;
que.push_back(c[i]);
dfs(dep+1);
state[i]=0;
que.pop_back();
}
}
}
}
ll n;
class Card
{
public:
char color;
int num;
Card(){}
Card(char a,int b):color(a),num(b){}
Card(string str)
{
color = str[1];
char tar = str[0];
if(tar>='0'&&tar<='9')num=tar - '0';
if(tar == 'T')num=10;
if(tar == 'J')num=11;
if(tar == 'Q')num=12;
if(tar == 'K')num=13;
if(tar == 'A')num=14;
}
const bool operator == (Card c)
{
return color==c.color&&num==c.num;
}
};
bool cmp_1 (Card c1,Card c2)
{
return c1.num<c2.num;
} bool cmp_2(Card c1,Card c2)
{
return c1.num>c2.num;
} Card cards[MAXN];
Card arr[ENDD][24][MAXN];
Card tmp[4][MAXN];
int points[4]; int search_number(char tar)
{
for(int i=0;i<4;++i)
{
if(tar == c[i])return i;
}return -1;
} int lcs(int a,int b)
{
int dp[MAXN][MAXN];
memset(dp,0,sizeof(dp));
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
int x=i+1;int y=j+1;
if(arr[a][b][i] == cards[j])
dp[x][y]=dp[x-1][y-1]+1;
else dp[x][y]=max(dp[x-1][y],dp[x][y-1]);
}
} return dp[n][n];
} void init()
{
memset(cards,0,sizeof(cards));
memset(arr,0,sizeof(arr));
memset(points,0,sizeof(points));
int res=0;
for(int i=0;i<n;++i)
{
string str;
cin>>str;
cards[i] = Card(str);
}
for(int i=0;i<n;++i)
{
for(int j=0;j<4;++j)
{
if(cards[i].color == c[j])
{
tmp[j][points[j]++]=cards[i];
break;
}
}
} for(int i=0;i<24;++i)
{
int point=0;
for(int j=0;j<4;++j)
{ char now = control[i][j];
int number = search_number(now);
int start=point;
for(int k=0;k<points[number];++k)
{
for(int m=0;m<ENDD;++m)
{
arr[m][i][point]=tmp[number][k];
} point++;
}
for(int m=0;m<ENDD;++m)
{
int k = 1<<j;
if(k&m)
{
sort(arr[m][i]+start,arr[m][i]+point,cmp_1);
}else sort(arr[m][i]+start,arr[m][i]+point,cmp_2);
}
}
} for(int i=0;i<ENDD;++i)
{
for(int j=0;j<24;++j)
{
res=max(res,lcs(i,j));
}
}
cout<<n-res<<endl; } int main()
{
cin.sync_with_stdio(false);
dfs(0);
while(cin>>n)init();
// cout<<3)<<endl;
return 0;
}

  

Card Hand Sorting 18中南多校第一场C题的更多相关文章

  1. Highest Tower 18中南多校第一场H题

    一.题意 给出N个方块,要求给出一个方案,使得1. 所有方块都被使用到(题目数据保证这点) 2.所有方块垒成一个塔,且上面的方块宽度小于下面的方块 3.每个方块只能用一次,可以横着或者竖着. n范围5 ...

  2. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  3. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  4. Artwork 18年中南多校第一场A

    一.题意 对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量? 二.思路 保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存. 之 ...

  5. 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)

    题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...

  6. 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

    题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...

  7. 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

    题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...

  8. 2014多校第一场D题 || HDU 4864 Task (贪心)

    题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...

  9. 2014多校第一场A题 || HDU 4861 Couple doubi

    题目链接 题意 : 有K个球,给你一个数P,可以求出K个值,(i=1,2,...,k) : 1^i+2^i+...+(p-1)^i (mod p).然后女朋友先取,再xp取,都希望赢,如果女朋友能赢输 ...

随机推荐

  1. Design Pattern ->Composite

    Layering & Contract Philosophy With additional indirection class CComponent { ; ; ; public: virt ...

  2. CSS 笔记之 CSS 选择器

    /*先设置背景再设置前景*/ pre{ background-color: #f8f8f8; border: solid 1px #ccc; border-radius: 3px; overflow: ...

  3. 快速排序c语言实现

    #include <stdio.h> void quick_sort(int* a, int n) { ) return; int i,j,tmp,k; k = a[n/]; ,j = n ...

  4. python模块详解 XML

    XML模块 XML是实现不同语言或程序之间进行数据交换的协议,和json一样. XML格式: <?xml version="1.0" encoding="UTF-8 ...

  5. 概念:RPG游戏中两个兵种互相攻击的逻辑

    直接上题目: 解析题目: 根据题目的解析,进行代码的实现: 输出结果: 心得: (1) 当我们面对‘公式结果不是我们想要的’时,应该在脑海里将一个完整的攻击流程进行想象,就会对流程有个更清晰的思路 ( ...

  6. MSMQ学习笔记二——创建Message Queue队列

    一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队 ...

  7. Leetcode 78. Subsets (backtracking) 90 subset

    using prev class Solution { List<List<Integer>> res = new ArrayList<List<Integer&g ...

  8. Graylog安装操作

    Graylog安装操作 实验环境centos7.5系统  mem:4-8G       disk:50G 关闭selinux以及firewalld 一.准备环境 1.1.java环境 下载java的j ...

  9. C#后台unxi时间戳转换为前台JS时间的方法

    后台返回的时间是一个格式为 /Date(1530153274362)/ 的unxi时间戳前台转换代码:var matchResult = data.match(/(\d+)/);if (matchRe ...

  10. robotframework实战二---Jenkins连用

    1.下载插件robot Jenkins环境搭建就不用说了,网上有很多帖子,你在使用时,你需要做以下几步 因为目前我已经安装了 2.新建项目 因为有重名的项目,所以会提示以下内容 你需要配置的内容就两处 ...