SPOJ 4053 - Card Sorting

我们的男主现在手中有n*c张牌,其中有c(<=4)种颜色,每种颜色有n(<=100)张,现在他要排序,首先把相同的颜色的牌放在一起,颜色相同的按照序号从小到大排序。现在他想要让牌的移动次数最小,问移动的最小次数是多少。

【LIS】因为颜色种类相当少,可以枚举排序后颜色的次序。相同颜色的纸牌从小到大排序,所以所有纸牌的最终顺序也就确定了。

然后就是怎么样移动纸牌能够使纸牌成为最终的顺序。

因为从给定序到有序的移动次数等于从有序到给定序,所以我们反着想,对于有序的序列,移动一张纸牌,那么它的最长不降序列就减少1。如果移动多个呢,只要求出其中没有改变的最大长度即可,这个长度就是原序列的最长不降序列。

一般的,如果给定序的最长不降序列是x,那么到有序状态的移动次数一定是n*c-x

#include<bits/stdc++.h>
#define eps 1e-9
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
using namespace std;
typedef long long LL;
struct node
{
    int c,w,hash;
}p[505];

int i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag;
int ord[5],c;
bool vis[5];

bool cmp(node a,node b)
{
    return a.hash<b.hash;
}

void work()
{
    for (int i=1;i<=n*c;i++)
    {
        p[i].hash=ord[p[i].c]*1000+p[i].w;//给每个元素一个唯一标识,按照这个标识来求最长不下降子序列
    }

    int dp[505],num;
    dp[0]=0;
    num=0;
    for (int i=1;i<=n*c;i++)
    {
        if (p[i].hash>=dp[num])
        {
            dp[++num]=p[i].hash;

        }else
        {
            k=upper_bound(dp+1,dp+1+num,p[i].hash)-dp;
            dp[k]=p[i].hash;
        }
    }

    ans=min(ans,n*c-num);
}

void dfs(int f)
{
    for (int i=1;i<=c;i++)
    {
        if (!vis[i])
        {
            vis[i]=1;
            ord[f]=i;
            if (f==c) work();else dfs(f+1);//枚举完毕后进入work()计算最长不下降子序列
            vis[i]=0;
        }
    }
}

int main()
{
    scanf("%d%d",&c,&n);
    ans=INF;
     for (i=1;i<=c*n;i++)
     {
        scanf("%d%d",&p[i].c,&p[i].w);
     }
     memset(vis,0,sizeof(vis));
     dfs(1);//DFS枚举颜色次序
     printf("%d\n",ans);
    return 0;
}
时间: 2024-11-05 20:36:39

SPOJ 4053 - Card Sorting的相关文章

《构建之法》之第8、9、10章读后感

第8章 第8章主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 软件需求的步骤为:1.获取和引导需求(Elicitation); 2.分析与定义需求(Analysis&Specification); 3.验证需求(Validation); 4.在软件产品的生命周期中管理需求(Management). 获取用户需求——用户调查:1.焦点小组(Focus Group); 2.深入面谈(In-depth Int

用户研究工作中的14个经典方法

历时2个多月的编撰和设计,#用研方法传遍中国#在今天将告一段落;经过仔细的梳理与总结,@百度商业UED 的用户研究工程师们将用户研究工作中的经典方法一一总结出来,与大家分享讨论,感谢和我们微博互动的同学们,也欢迎更多对用户体验感兴趣的同学加入讨论,大家共同努力.共同进步! 1 .[眼动&脑电研究] 将眼动仪和脑电设备联机同步,可以知道用户是如何看的,以及当时的心理活动. 2 .[可用性测试] 想知道可用测试是什么?可用性测试的目的&作用?适用的场景?测试所需的人数? 3.[信噪比原则] 如

[转载]敏捷体验设计师应该具备的12项技能

敏捷UX和传统瀑布式UX不同之处在于它与交付过程的强关联关系,对于人的要求也更加全面.这意味着你将改变你曾经绝大部分时间只在角落里做一件事的习惯,以更加开放的姿态融入合作.本文将从技能交付出发,在策略.设计和研究三个层次阐明敏捷体验设计师应该掌握的12种技能. 敏捷UX和传统瀑布式UX不同之处在于它与交付过程的强关联关系,对于人的要求也更加全面.这意味着你将改变你曾经绝大部分时间只在角落里做一件事的习惯,以更加开放的姿态融入合作.本文将从技能交付出发,在策略.设计和研究三个层次阐明敏捷体验设计师

《构建之法》--阅读

<构建之法> 第八章 需求分析 1.软件需求的步骤: <1>.一般划分情况  a.获取和引导需求(Elicitation) b.分析和定义需求(Analysis & Specification)  c.验证需求(Validation)  d.在软件的生命周期中管理需求(Management) <2>.不同角度的划分     a.对产品功能性的需求:要求产品必须实现某些功能   b.对产品开发过程的需求:要求软件的开发流程必须满足某些约束条件   c.非功能性需求

构建之法——读书笔记(6)

第8章 需求分析 8.1 软件需求 寻找需求: 1. 获取和引导需求(Elicitation) 软件团队需要找到软件的利益相关者,了解和挖掘他们对软件的需求,引导他们表达出对软件的需求. 2. 分析和定义需求(Analysis&Specification) 这是指对从各个方面获取的需求进行规整,定义需求的内涵,从各个角度将需求量化(需求实现的最后期限,实现需求大致所需的时间和资源成本,各个不同需求的优先级,需求带来的收益,等等). 3. 验证需求(Validation) 软件团队要跟利益相关者沟

用户研究

用户研究工作中的14个经典方法 时间:2013-02-05 02:51 来源:百度商业UED 作者:百度商业UED 历时2个多月的编撰和设计,#用研方法传遍中国#在今天将告一段落;经过仔细的梳理与总结,@百度商业UED 的用户研究工程师们将用户研究工作中的经典方法一一总结出来,与大家分享讨论,感谢和我们微博互动的同学们,也欢迎更多对用户体验感兴趣的同学加入讨论,大家共同努力.共同进步! 1 .[眼动&脑电研究] 将眼动仪和脑电设备联机同步,可以知道用户是如何看的,以及当时的心理活动. 2 .[可

【产品规划】用户体验要素

一. 用户体验为什么如此重要 日常生活中的遭遇:X职员悲惨的一天 什么是用户体验 产品如何与外界发生联系并发挥作用,也就是如何“接触”和“使用”产品 人们如何“接触”和“使用”它 每一件产品都具有用户体验 FAQ:他用起来难不难,是不是很容易学,使用起来的感觉如何 无论是什么产品,用户体验总是体现在细微之处 使用到场景 交通事故 收银机 加油机 咖啡机 闹钟 从产品设计到用户体验设计 不能算是真正的“设计” 人们往往会想到的产品设计是 感官方面 精心设计 很好的触觉 常常被忽略 嗅觉 味觉 听觉

构建之法 第八章 需求分析

其实这是"啃硬骨头"的第一步,就是如何从"茫茫"中锁定需求相关方.挖出来需求的方法论 1.挖取需求 获取和引导需求.需求不仅是来自外界,甚至也可以来自技术成员团队内部: 分析和定义需求.主要是对需求进行量化: 验证需求. 在软件产品的生命周期中管理需求 需求不一定只在初期才有:在中后期的时候可能因为外界环境变化甚至是成员自身水平变化而出现新的需求 2.软件产品的利益相关者 最终用户(使用软件的人) 顾客(购买软件的人) 监管部门 3.获取用户需求的方法 焦点小组(f

8.9.10

第八章 8/主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种问题而有求于软件 2.而作为软件团队,准确而全面地找到这些需求主要的步骤为: (1)获取和引导需 (3)验证需求 (2)分析和定义需求 (4)在软件产品的生命周期中管理需求 3.用户对软件的需求又分为:对产品功能性的需求:对产品开发过程的需求:非功能性需求:以及综合需求.所以软件团队和客户代表在需