[SinGuLaRiTy] 2017-03-30 综合性测试

【SinGuLaRiTy-1014】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.

对于所有的题目:Time Limit:1s  |  Memory:256 MB

第一题:完美序列

【题目描述】

给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿,现在给你一个k,表示你最多可以删去k类数。数列中相同的数字被称为一类数。设该数列中满足所有的数字相等的连续子序列被叫做完美序列,你的任务就是通过删数使得该数列中的最长完美序列尽量长。

【输入】

第一行两个整数N,K。

接下来N行,每行1个整数,表示第i个数。

【输出】

最长的完美序列的长度。

【样例数据】

样例输入 样例输出

9 1

2

7

3

7

7

3

7

5

7


4

【STD Code】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int ans;
int kind[200000];
struct node
{
    int value;
    int pos;
};
node data[200000];
int cmp_value(node a,node b)
{
    return a.value<b.value;
}
int cmp_origin(node a,node b)
{
    return a.pos<b.pos;
}
int main()
{
    int n,k;
    int t,now,contain,l;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
      scanf("%d",&data[i].value);
      data[i].pos=i;
    }
    sort(data+1,data+n+1,cmp_value);
    now=1;
    t=data[1].value;
    for(int i=1;i<=n;i++)
        if(data[i].value==t)
            data[i].value=now;
        else
        {
            now+=1;
            t=data[i].value;
            data[i].value=now;
        }
    sort(data+1,data+n+1,cmp_origin);
    contain=0;
    l=1;
    for(int i=1;i<=n;i++)
    {
        if((kind[data[i].value]==0)&&(contain<=k))
        {
            contain+=1;
            kind[data[i].value]+=1;
            ans=max(ans,kind[data[i].value]);
        }
        else if((kind[data[i].value]==0)&&(contain>k))
        {
            kind[data[i].value]+=1;
            kind[data[l].value]-=1;
            while(kind[data[l].value]!=0)
            {
                l+=1;
                kind[data[l].value]-=1;
            }
            l+=1;
            ans=max(ans,kind[data[i].value]);
        }
        else
        {
            kind[data[i].value]+=1;
            ans=max(kind[data[i].value],ans);
        }
    }
    printf("%d",ans);
    return 0;
}

【题目分析】

别的先不说,看到仅有100000个数字,数据范围却是1000000000,就说明我们首先要对这个序列进行离散化。在这里,可以开一个结构体,定义两个值:value和pos,value表示值,pos表示这个数原本在序列的哪一个位置,先用一次sort对value进行排序,更改值的大小(也就是离散化的中心操作),接着再来一次sort,按pos排序,以此将序列的位置排布还原为原来的序列。

下面,我们就来看看这道题的中心思路:设置一个“移动窗口”。也就是说,定义两个变量:L,R,来记录可能答案的潜在区间。在最开始,我们将L,R初始化为0,即L,R将从序列的最左端开始向右扫描。由于题目中有要求“仅能删除k类数”,那么,当窗口刚刚开始移动时,我们可以先保持L不动,使R右移,与此同时,不断更新在该窗口内存在的数的种类(当然,你也要算出此时的最优解),当种类达到k+1种时,就说明当前区间已经塞满啦,此时要想继续使窗口移动,就要使L+=1,更新之后,再让R+=1......以此类推,不断使窗口移动下去,直到扫描至序列末端,此时的答案就是整个序列中的完美序列的最优解了。

时间: 2024-10-27 19:59:01

[SinGuLaRiTy] 2017-03-30 综合性测试的相关文章

synopsys.Vera.vI-2014.03.Linux32_64 2CD 测试向量自动生成

synopsys.Vera.vI-2014.03.Linux32_64 2CD 测试向量自动生成          Vera验证系统满足了验证的需要,允许高效.智能.高层次的功能验证.Vera验证系统已被Sun.NEC.Cisco等公司广泛使用以验证其实际的产品,从单片ASIC到多片ASIC组成的计算机和网络系统,从定制.半定制电路到高复杂度的微处理器. Sidefx Houdini Master v8.2.31 1CD(创建高级视觉效果的终极工具) Sidefx Houdini Master

datetime处理日期和时间(2017.9.30)

1.datetime.now() # 获取当前datetimedatetime.utcnow() 2.datetime(2017, 5, 23, 12, 20) # 用指定日期时间创建datetime 代码如下: from datetime import datetime now=datetime.now() print('当前时间:',now) utcnow=datetime.utcnow() print('世界标准时间:',utcnow) dt=datetime(2017, 5, 23, 1

【谜客帝国】第110届云月(庄若云&amp;月思)合擂谜会(2017.07.30)

 [谜客帝国]第110届云月(庄若云&月思)合擂谜会(2017.07.30) 主持:瓷    计分:手手 1.“接天帆影入残云”(10笔字)蚕/月思 [注:面出陈德永<客居月余归后寄友人>.残云,别解提音.] 2.“西风长笛水边楼”(9笔字)洙/月思 [注:面出张养浩<黄州道中>:长笛,象形“一”.] 3. 河间元琛最豪首(2字铁道线路名)玉昌/月思 [注:典据<洛阳伽蓝记>,“而河间王(元)琛最为豪首”:青海玉树州至西藏昌都市的铁路线称为“玉昌线”.] 4. 

【谜客帝国】第149届汝隅主擂谜会(2019.03.30)

[谜客帝国]第149届汝隅主擂谜会(2019.03.30) 主持:瓷    计分:雪宝 1.赞歌唱6.1(动漫人物•卷帘)哆啦美 [赞扣美,1和6唱出来是哆啦] 2.“枕前泪共阶前雨,隔着窗儿滴到明”(明人)戚继光 3.湘玉呼展堂,赶紧去上工(4字对酒介绍语,含酒名)叫老白干 4.留下雄信待聚会(金融词二)存单.通汇 5.五音未闻宫徵羽(国际事件•重门)贸易战 [注:先扣商角,重门出底] 6.殷功是否尚存生(对歌手到场情况询问语2+3)崔健在不在 [注:崔护,字殷功] 7.“孤与云长,誓同生死:

2017.4.7------软件测试的艺术+整理以前的摘记

2017.4.17 以下内容来自<软件测试的艺术> 第1页--20页.供自己学习使用.   第一章 软件测试:就是一个过程或一个系列过程,用来确认计算机代码完成了其应该完成的功能,不执行其不该有的操作. 第二章    测试人员需要有正确的态度.每当测试一个程序时,应当想到的是为程序增加一些价值.通过测试来增加程序的价值,是指测试提高了程序的可靠性或质量,提高程序可靠性,是指找出并最终修改了程序的错误. 1.有人把没发现错误的测试用例称为一次"成功的测试",而将发现了某个新错

2017.03.02-2017.09.28 日常随笔

1.ping域名能指定到对应ip即代表解析成功.请求超时有可能是ping防火墙关闭原因.2.2014phpstudy升级到2016.目前项目2016用到的都是5.2.17版本.并设置对应版本的配置.3.hosts右击无管理员运行选项,可以用管理员身份打开记事本,再去打开hosts4.linux无法远程登录.购买的服务器可以更换系统盘5.数据库盘的挂载6.对动态磁盘的了解,不受盘符限制,称为卷7.hosts的意义8.解决文件clearup失败的原因9.解决HTTP错误代码500的原因10.打开磁盘

2019.03.30 Dialog demo 一个标准使用的dialog程序

1 PROGRAM zdemo_dialog. 2 3 INCLUDE zdemo_dialogtop. 4 INCLUDE zdemo_dialogo01. 5 INCLUDE zdemo_dialogi01. 6 INCLUDE zdemo_dialogf01. 7 INCLUDE zdemo_dialoghelp. *&---------------------------------------------------------------------* *& 包含       

2017.4.11 storm-kafka测试

测试storm-starter里的TridentWordCount,测试storm-kafka模块,单独建立工程, 注意log4j-slf4j-impl-2.1引起的依赖冲突,之前运行报错都是因为在storm安装包的lib库里已经有这个jar包了, 编译topology的时候又有其他依赖于这个jar包的工程把它打包进来了,从而引发冲突,从工程中去除这个依赖就好了.. 然后storm-kafka里的TridentWordCount运行成功.到这里kafka-storm-hbase全部打通,剩下整合

【重构学习】03 重构与测试

新的一年了,我却在这里写这个鬼 <重构>的这一章主要是讲java的一个测试框架,我直接就跳着看了 只是简单的看了一下它的思想 重构需要一个良好的测试体系,而我们需要为重构构建一个这样的体系,这是重构的前提 不需要期待完美测试,需要的是不完美的测试已经在实际执行了 测试的时候考虑可能出错的边界条件,并集中火力 不要因为测试无法捕捉所有BUG就不写测试,至少它可以捕捉大多数 花合理的时间抓出大多数BUG 写测试代码去让其执行自动化测试 好了这就是本章主要的内容 不太多,就来简单谈一下自己对测试的理