一、题意

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

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

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

二、做法

考虑,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. extjs 6

    因为最近公司要写一个项目前台所以开始学习extjs前端框架,希望一起共勉. 那么我们的教程就从 Hello World 讲起. helloWorld.js   Ext.onReady(function ...

  2. 零基础逆向工程38_Win32_12_信号量_线程控制小结

    1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE Create ...

  3. Android Process & Thread

    Native Service and Android Service Native Service:In every main() method of NativeService, which is ...

  4. Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid b

    Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid b ...

  5. 【微软大法好】VS Tools for AI全攻略(4)——选择适合自己的虚拟机

    当我们选择好了自己的虚拟机后,也许效果不尽如人意.就比如我,发现代码在训练一段时间之后,CPU的使用率会下降. 这个时候我们就要开始考虑,是不是我们选择的虚拟机不是适合自己的型号. Azure的虚拟机 ...

  6. 504. Inverted Index (Map Reduce) lintcode

    https://www.lintcode.com/problem/inverted-index-map-reduce/description -- decription of the map redu ...

  7. Selenium入门6 操作元素,获取元素属性

    取元素的text,属性get_attribute,标签名tag_name 操作元素:send_keys输入,click点击,submit提交,clear清除输入 状态判断:is_display,is_ ...

  8. testng失败重跑

    重跑失败场景 1.要添加两个文件 背景:因为这里只是想单独展示失败的重跑的案例,所以先暂时把app这块的运行注释掉,只跑一个简单的demo,就一个简单类,类中就3个测试方法,失败重跑的原理是,运行方法 ...

  9. NutDao配置多数据源

    首先,我必须声明,这是一个非常简单的方法,很多小菜没做出来,是因为把nutz想得太复杂 数据源(或者是数据库连接池),在Nutz.Ioc看来,是一个普通的Bean,没任何特别之处. 再强调一点,除了$ ...

  10. Android(java)学习笔记71:Tab标签的使用

    1. 案例1---TabProject (1)首先是main.xml文件: <?xml version="1.0" encoding="utf-8"?&g ...