2388: 最短区间

Time Limit: 1 s      Memory Limit: 128 MB

Submit My Status

Problem Description

有M种不同颜色的气球(颜色从1至M表示),现在有一排N个位置,需要往这N个位置中填充一些气球,可填也可不填。求最短的区间长度使的这个区间中包含M种颜色的气球。如果没有则输入-1.

Input

第一行输入N和M,N表示位置长度,M表示气球颜色数量。(1≤M≤1000,1≤N≤106)(1≤M≤1000,1≤N≤106)。

第二行输入N个数,第i个数ai表示第i个位置气球的颜色,0表示没填充气球。(0≤ai≤M)(0≤ai≤M)

Output

输出符合要求的最短区间长度,没有则输入-1。

Sample Input

10 6
1 2 3 4 6 3 0 1 2 5

Sample Output

7

题解:用数组p记录颜色,数组cnt记录各颜色出现次数,x代表所取区段的头部,num记录颜色种类,当遍历到头部颜色出现两次,头部往后移动直至该头部颜色只出现一次(目的就是不改变颜色种类的前提下通过移动头部缩短区间长度),每次遍历判断一下颜色种类是否达到,达到则取最短区间长度。

#include<iostream>
#define ll long long
using namespace std;
ll p[1000011],cnt[1011];
int main()
{
ll n,m,x,mn,num;
scanf("%lld %lld",&n,&m);
x=0;mn=9999999999;num=0;
for(int i=0;i<n;i++){
scanf("%d",&p[i]);
if(!p[i])//0
continue;
if(!cnt[p[i]])//未出现过的颜色
num++;
cnt[p[i]]++;//该颜色出现次数+1
while(!p[x]||cnt[p[x]]>1){//出现与头部相同的颜色或者头部为0,头部往后推1位
cnt[p[x]]--;
x++;
}
if(num==m)//
mn=min(mn,i-x+1);
}
printf("%d\n",num==m?mn:-1);
return 0;
}

最新文章

  1. 原生js模拟锚点,实现点击后,内容定位到本页的对应位置
  2. 1Z0-053 争议题目解析683
  3. JSP基础语法---九九乘法表-java jsp
  4. 仿SGI STL的traits技法
  5. [BIM]BIM中IDM介绍
  6. POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)
  7. [图形学] Chp8.4 OpenGL 二维观察函数——视口
  8. 使用EF对已存在的数据库进行模块化数据迁移
  9. SpringMVC 知识整理
  10. libevent之event_base
  11. Esp8266
  12. 转载-Python单元测试框架——unittest
  13. 机器学习入门07 - 验证 (Validation)
  14. springboot+ELK+logback日志分析系统demo
  15. python 08
  16. hdu 2095 find your present (2) 位运算
  17. studio-3t-x64 下载地址
  18. flex 布局 出滚动条的操作
  19. myeclipse 上安装 Maven3
  20. SQL Server 运行状况监控SQL语句

热门文章

  1. [USACO19FEB]Mowing Mischief
  2. java的toString方法和sort方法
  3. CTF--web 攻防世界web题 get_post
  4. &lt;03&gt;labview在winCE6.0系统下的程序移植与界面开发
  5. PLSQL Developer中文乱码问题
  6. easyExcel导出excel的简单使用
  7. 【bzoj 3495】PA2010 Riddle
  8. stringify()和parse()的区别
  9. 开发一个项目之ES2015+
  10. 2018-2019-2 20175235 实验二《Java面向对象程序设计》实验报告