Card Hand Sorting 18中南多校第一场C题
一、题意
随机给你一堆牌(标准扑克牌),之后让你按照:
第一优先规则:所有相同花色的在一起
第二优先规则:所有相同花色的必须按照升序或者降序排列
问,你最少要拿出多少张牌插入到其他的地方以维持这个状况?
二、做法
考虑,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题的更多相关文章
- Highest Tower 18中南多校第一场H题
一.题意 给出N个方块,要求给出一个方案,使得1. 所有方块都被使用到(题目数据保证这点) 2.所有方块垒成一个塔,且上面的方块宽度小于下面的方块 3.每个方块只能用一次,可以横着或者竖着. n范围5 ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- 【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 ...
- Artwork 18年中南多校第一场A
一.题意 对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量? 二.思路 保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存. 之 ...
- 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)
题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...
- 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- 2014多校第一场D题 || HDU 4864 Task (贪心)
题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...
- 2014多校第一场A题 || HDU 4861 Couple doubi
题目链接 题意 : 有K个球,给你一个数P,可以求出K个值,(i=1,2,...,k) : 1^i+2^i+...+(p-1)^i (mod p).然后女朋友先取,再xp取,都希望赢,如果女朋友能赢输 ...
随机推荐
- 微信小程序实战篇:商品属性联动选择(案例)
本期的微信小程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果,素材参考了一点点奶茶. 效果演示: 商品属性联动.gif 代码示例 1.commodity.xml <!-- < ...
- mac笔记本上的工具
svn可是换工具:cornerstone host修改工具:switchHosts!
- StackTrack for debug
System.Diagnostics.Debug.WriteLine("Serial port. {0},{1}", this.GetType().FullName, new Sy ...
- 关于硬盘分区使用exFat格式的优势及劣势(含摘抄)
优势 可以设置最大32M的簇: 不记录日志. 劣势 无法使用windows的“文件共享”: 通过近期某个文件数量密级任务的测试发现,在大量文件的处理性能上,NTFS比exFAT文件系统的性能高出不少. ...
- Javascript作业—封装type函数,返回较详细的数据类型
Javascript作业—封装type函数,返回较详细的数据类型 思路: 1 取typeof的值,如果是数字.函数等非对象类型,直接取类型 2 如果是object类型,则调用Object.protot ...
- 解决SD卡频繁读写问题 Anything-sync-daemon 映射linux目录到tmpfs并定时同步
Anything-sync-daemon (asd) is a is a diminutive pseudo-daemon designed to manage target directories ...
- [pytorch] 官网教程+注释
pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...
- .clone事件当你克隆的时候,DOM节点是克隆出来了,但是克隆出来的节点不能运行时事件 ...
解决办法如下在clone()里面加个参数true,即可完成事件的植入.即:.clone(true).clone( [ withDataAndEvents ], [ deepWithDataAndEve ...
- js 金额小写转换为大写
<script> jQuery(document).ready(function () { //当金额文本框失去焦点时,自动将数字转化为大写填充到 大写的文本框中 $("#Amo ...
- js图片库 案例
事件处理函数:事件处理函数的作用是,在特定事件发生时调用特定的JavaScript代码.本例中想要在用户点击某个链接的时候触发一个动作,所以需要使用onclick事件处理函数. 添加事件处理函数的语法 ...