一、题意

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

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

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

二、做法

考虑,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. css float布局--右侧上部固定下部自适应大小

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Android自定义控件 -- 带边框的TextView

    使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...

  3. 【起航计划 019】2015 起航计划 Android APIDemo的魔鬼步伐 18 App->Device Admin 设备管理器 DeviceAdminReceiver DevicePolicyManager PreferenceActivity的使用

    Device Admin示例介绍了类DeviceAdminReceiver,DevicePolicyManager和ActivityManager. 使用DevicePolicyManager这个类, ...

  4. 服务器raid状态监控

    参考 http://hwraid.le-vert.net/wiki 查看raid芯片 lspci -v 02:00.0 SCSI storage controller: LSI Logic / Sym ...

  5. Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)

    project 编译问题,需要三处的jdk版本要保持一致,才能编译通过. 1.在项目上右键properties->project Facets->修改右侧的version  保持一致 2. ...

  6. iOS获取/删除url中的参数

    1.获取URL中的某个参数: - (NSString *)getParameter:(NSString *)parameter urlStr:(NSString *)url { NSError *er ...

  7. 好的学习网站和app推荐

    1  W3cschool: http://www.w3school.com.cn/ 菜鸟教程: http://www.runoob.com/ 2 视频学习网站和app:网易云课堂.腾讯课堂.慕课网(h ...

  8. 2017.11.14 C语言---指针的学习

    第八章 善于利用指针 (1)指针是什么 1.内存区每一个字节都有一个编号,这就是"地址".地址形象化的被称为"指针".它能通过以它为地址的内存单元.地址指向(* ...

  9. css3之Media Queries 媒体查询

    一.初步了解 Media Queries是CSS3新增加的一个模块功能,其最大的特点就是通过css3来查询媒体,然后调用对应的样式. 了解Media Queries之前需要了解媒体类型以及媒体特性: ...

  10. caffe resize用interpolation

    opencv的resize默认的是使用双线性插值INTER_LINEAR,也可以是尝试其他的方式进行插值操作 if (param.random_interpolation_method()) { // ...