Kattis - cardhand Card Hand Sorting 【暴力枚举】
题意 
给出 一个扑克牌的序列 求排成一个“有序”序列 最少的插入次数 
有序是这样定义的
同一个花色的 必须放在一起 同一花色中的牌 必须是 升序 或者是 降序
然后 A 是最大的
思路
我们可以枚举一下 
一共有四种花色的 就是 4!  
每种升序 有 升序 和 降序 就是 2 ^ 4 
4 ! * 2 ^ 4 = 384  可以接受 
然后次数 怎么求呢  就是 n - LCS(arr)
因为 这不是 交换 来变得 有序   如果是交换来变得有序 就是 求逆序数 
插入的话 就将这个序列 求出其 最长上升子列  这个 子列不动  其他元素 依次 插入就可以
然后讲讲 怎么枚举
首先 枚举 花色 就是  
 我们 将 四种花色 分别与 0 1 2 3 对应起来 
然后用一个 数组 arr[4]= {0, 1, 2, 3}  求这个花色的全排列 这就定义了 花色的 先后次序
arr[i] 表示 数字i 对应的花色的优先级是多少
然后 枚举 升序 降序
我们可以用 0-15 这16 个数字的二进制来表示 升序 还是降序
我们可以重新 给它  定义一个 v 
降序 就是将 原值 取负数  然后 按 升序排序 实际上 就是 原值的降序排序
比如 0 这个数字 对应四位的二进制数字 是 0000
所以 这个时候 四种花色 都是 升序的 我们可以用花色的优先级 来表示 对应哪位数字
比如 此时 s 花色 对应的 优先级是 0 那么 就是将 0 右移 0 位 再 & 1 就可以判断它对应位 是 1 还是 0
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-30;
const int INF = 0x3f3f3f3f;
const int maxn = 4e5 + 5;
const int MOD = 1e9 + 7;
map <char, int> m;
int color[4] = { 0, 1, 2, 3 };
void init()
{
    m['s'] = 0;   // suit
    m['h'] = 1;
    m['d'] = 2;
    m['c'] = 3;
    for (int i = 2; i <= 9; i++)
    {
        m[i + '0'] = i;
    }
    m['T'] = 10;   // num
    m['J'] = 11;
    m['Q'] = 12;
    m['K'] = 13;
    m['A'] = 14;
}
struct node
{
    int num, suit;
    int v;
    int id;
}q[60];
bool comp(node x, node y)
{
    if (x.suit == y.suit)
        return x.v < y.v;
    else
        return color[x.suit] < color[y.suit];
}
int n;
int LCS(node q[])
{
    int dp[60];
    CLR(dp, 0);
    dp[0] = 1;
    int ans = 1;
    for (int i = 1; i < n; i++)
    {
        dp[i] = 1;
        for (int j = 0; j < i; j++)
        {
            if (q[i].id > q[j].id)
            {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        ans = max(dp[i], ans);
    }
    return ans;
}
int main()
{
    init();
    scanf("%d", &n);
    char s[3];
    for (int i = 0; i < n; i++)
    {
        scanf(" %s", &s);
        q[i].id = i;
        q[i].num = m[s[0]];
        q[i].suit = m[s[1]];
    }
    int ans = INF;
    do
    {
        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < n; j++)
            {
                q[j].v = q[j].num * (((i >> color[q[j].suit]) & 1) != 1 ? 1 : -1);
            }
            sort(q, q + n, comp);
            ans = min(ans, n - LCS(q));
        }
    } while (next_permutation(color, color + 4));
    cout << ans << endl;
}
												
											Kattis - cardhand Card Hand Sorting 【暴力枚举】的更多相关文章
- Card Hand Sorting 二进制枚举暴力
		
这个题其实由于只有4种花色的,那么每种花色排列的顺序,也不过是4!种,然后对于每种花色内部到底是升序还是降序,其实也可以直接暴力,一共也就4!*2^4种情况,然后直接进行排序就可以了,但是我们如何计算 ...
 - 【二进制枚举+LCS】Card Hand Sorting
		
[二进制枚举+LCS]Card Hand Sorting 题目描述 When dealt cards in the card game Plump it is a good idea to start ...
 - CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution (暴力枚举)
		
题意:求定 n 个数,求有多少对数满足,ai^bi = x. 析:暴力枚举就行,n的复杂度. 代码如下: #pragma comment(linker, "/STACK:1024000000 ...
 - 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
		
/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...
 - HNU 12886 Cracking the Safe(暴力枚举)
		
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数 ...
 - 51nod 1116 K进制下的大数  (暴力枚举)
		
题目链接 题意:中文题. 题解:暴力枚举. #include <iostream> #include <cstring> using namespace std; ; ; ch ...
 - Codeforces Round #349 (Div. 1)  B. World Tour 最短路+暴力枚举
		
题目链接: http://www.codeforces.com/contest/666/problem/B 题意: 给你n个城市,m条单向边,求通过最短路径访问四个不同的点能获得的最大距离,答案输出一 ...
 - bzoj 1028 暴力枚举判断
		
昨天梦到这道题了,所以一定要A掉(其实梦到了3道,有两道记不清了) 暴力枚举等的是哪张牌,将是哪张牌,然后贪心的判断就行了. 对于一个状态判断是否为胡牌,1-n扫一遍,然后对于每个牌,先mod 3, ...
 - POJ-3187 Backward Digit Sums (暴力枚举)
		
http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...
 
随机推荐
- go --socket通讯(TCP服务端与客户端的实现)
			
这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端.服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议.为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的 ...
 - Android 使用SharedPreferences数据存储
			
自己写了个SP辅助类 尽管写的有点啰嗦,也是自己的成果.例如以下: package com.yqy.yqy_testsputil; import android.annotation.Suppress ...
 - C++测试题练习题1
			
1.which of the following is not automatically generated by the compiler? a. default constructor b ...
 - 手机APP自动化持续集成方案
			
自动化测试流程 自动化测试框架
 - 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】
			
转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1) ...
 - Kali Linux 2.0安装光盘分享
			
Kali Linux 2.0安装光盘分享 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I ...
 - Libimseti推荐系统
			
技术:easyUI.jQuery.Spring.Struts.Hibernate.Mahout.MySQL 本Libimseti推荐系统使用数据.代码參考<Mahout in action> ...
 - Win7如何自定义鼠标右键菜单 添加用记事本打开
			
鼠标右键用记事本打开.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Notepad] @="用记事本 ...
 - java命令行
			
Launches a Java application. Synopsis java [options] classname [args] java [options] -jar filename [ ...
 - apue学习笔记(第五章 标准I/O)
			
本章讲述标准I/O库 流和FILE对象 对于标准I/O库,它们的操作是围绕流进行的.流的定向决定了所读.写的字符是单字节还是多字节的. #include <stdio.h> #includ ...