Sicily:1351.Multi-key Sorting

Sicily : 1351. Multi-key Sorting

Sicily上的这道题,我刚开始做以为是要除去一个序列中连续且重复的片段,但后来发现

去重之后的序列依然可能不是最短的,比如说:

序列:{ 1、2、3、1、2、1、2 }

这个序列,消去连续且重复的片段之后变为:

{ 1、2、3、1、2 }

而实际上,序列:3、1、2才是真正的最短序列。

在此,我先给出本题的解法:从序列的最后一个开始遍历整个序列,将重复遍历的元素删去,最后剩下的序列就是最短序列。

那么,为什么这样的方法是可行的呢?

首先,我们举一个非常简单的例子:

假如:C=2 ,N=3 (列数为2,操作序列长度为3)

最初的序列是:①:{1、2、1} ,按照之前给出的解法,最短序列应为②:{2、1 }

  因为①中最后一个元素为1,所以我们最后对矩阵的第1列进行了排序。因为我们是对任意一个矩阵而言的,所以第1列中可能会有相同元素,所以这些相同元素所在的那几行如何排序取决于①的子序列{1、2}中对其他列的排序情况(因为只有对除了最后一列的其他列进行排序,才能改变最后一列中相同元素的相对顺序)。因此序列①中的第一个元素1是不起作用的,可以删去。

  由此,我们可以把上面这个例子进行推广:

  序列中如果出现{ … , a, … , a , …} ,即序列中出现两个相同元素,那么同上文中所述的原理,我们可以删去第一个出现的元素,所得到的序列与原序列等价。

下面附上代码:

#include <bits/stdc++.h>

using namespace std ;

int a[3000005] , b[3000005] ;
int visit[1000005] ;
int main ()
{
    int c , n , k ;
    while(scanf("%d %d" , &c , &n) != EOF)
    {
        for(int i=0 ; i<n ; i++)
            scanf("%d" , &a[i]) ;
        k = 0 ;
        for(int i=n-1 ; i>=0 ; i--)
        {
            if(!visit[a[i]])
            {
                b[k++] = a[i] ;
                visit[a[i]] = 1 ;
            }
        }
        printf("%d\n" , k) ;
        printf("%d" , b[k-1]) ;
        for(int i = k-2 ; i >= 0 ; i--)
            printf(" %d" , b[i]) ;
        printf("\n") ;
        memset(visit , 0 , sizeof(visit)) ;
    }
    return 0 ;
}
时间: 2024-10-25 19:39:34

Sicily:1351.Multi-key Sorting的相关文章

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

redis学习之二from github

大概敲了一遍基本命令,熟悉了redis的存储方式.现在开始进一步系统的学习.学习教程目前计划有三个,一个是github上的https://github.com/JasonLai256/the-little-redis-book/blob/master/cn/redis.md,一个是中文官方网站http://www.redis.cn/documentation.html,还有一个看起来像w3c风格的简单教程http://www.runoob.com/redis/redis-commands.htm

Java中常见的排序算法

这是我摘取的一段英文资料,我觉得学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At Cprogramming.com, we offer tutorials for understanding the most important and common sorting techniques. Each algorithm has particular strengths and w

全面剖析Redis Cluster原理和应用 (转)

1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cluster推出之前,可用性要靠Sentinel

全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cl

redis notes

brew install redis redis-server select 0/1/2/3 set name 'name' set user:1 'name' string set get append keyname appendvalue getrange keyname rangestart rangeend setrange keyname rangestart value getset keyname value mset(m means multi) key value key v

Redis中国用户组|唯品会Redis cluster大规模生产实践

嘉宾:陈群 很高兴有机会在Redis中国用户组给大家分享redis cluster的生产实践.目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作 Outline 一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性,应用成熟度,踩到过那些坑,如何解决这些问题?这部分是大家比较关心的内容.第4节:简单介绍大规模运营的一些

STL 之 set 使用详解

使用set和multiset前包含头文件<set> set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素.他们都是有序集合. std::set is an associative container(关联容器) that contains a sorted set of unique objects of type Key. Sorting is done using the key comparison function Compare. S

YYModel 源码解读(二)之NSObject+YYModel.h (1)

本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 逐步添加的. #define force_inline __inline__ __attribute__((always_inline)) 这行代码用到了C语言的内联函数 内联函数: 是用inline修饰的函数,内联函数在代码层次看和普通的函数结构一样,却不具备函数的性质,内联函数不是在调用时发生控