POJ3320 尺取法的正确使用法
一、前言及题意:
最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书、蓝书,似乎都有些不尽如人意。这两天看到了日本人的白书,重新读了一遍,其中若干章节写的非常务实也实践起来相当实用,于是这就是白书上面一道推荐的题目,用于训练尺取法的例题。考虑到最近老是读错题,所以就慢慢习惯于首先把个题目翻译成中文之后在进行解读:
杰西卡是个非常可爱的女孩子,因而有若干男孩子追她,最近他的考试要到了,她需要花相当多部分的时间在这件事情上面,吐过他想通过考试,那么她就必须把所有的只是点都熟悉透,但是写教科书的人似乎十分在意一些奇怪的东西,于是他将将有的知道hisIan重复了若干次。杰西卡童鞋希望知道她最少需要看多少页连续的书才能够完成她的复习进度。一个爱慕她的男孩子已经把每一页的知识点使用独立的编号标示了出来,但是他并不能够很好的完成这个统计工作,所以你收到的聘用。
链接:https://vjudge.net/problem/POJ-3320
二、做法:
传统意义上如果我们要枚举连续的片段将会几乎必然花费N2的时间来进行这个枚举,但是根据尺取法的思路,我们并没有必要完全的枚举每种集合(如果他们显然不合理的的话),此时的思路是,首先设置一个游标,使得游标在慢慢往后移动这代表了整个区间的结束位置,没到达一个点,将记录该点在区间中的出现次数,如果之前没有出现过,则应当给CNT变量加上1,如果此时cnt变量等于所有知识点的总数,则应开始移动开始端的游标,每到一处则减少1.。
但是这道题有些坑:
1,及即使关了同步,cin也会因为太慢而超时。
2,因为输入整个只有一行,所以关同步这个操作会使得scanf无法读取到全部所有的数据。
于是注释掉关同步的行,cin换成scanf就可以了。
详见代码:
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
using namespace std; const long long MAXN=+;
int arr[MAXN];
int numb[MAXN];
int cntt[MAXN];
int ans=MAXN;
int n; set<int>s;
void init()
{
cin>>n;
int pp=;
for(int i=;i<n;++i)
{
scanf("%d",&arr[i]);
// cin>>arr[i];
if(!s.count(arr[i]))numb[pp++]=arr[i],s.insert(arr[i]);
}sort(numb,numb+pp);
int spos=-;int cnt=;
for(int i=;i<n;++i)
{
int pos=lower_bound(numb,numb+pp,arr[i])-numb;
if(!cntt[pos])cnt++;cntt[pos]++;
while(cnt==pp)
{
ans=min(ans,i-spos);
spos++;
int pos2=lower_bound(numb,numb+pp,arr[spos])-numb;
cntt[pos2]--;
if(!cntt[pos2])cnt--;
}
}
cout<<ans<<"\n"; } int main()
{
// cin.sync_with_stdio(false);
init(); return ;
}
POJ3320 尺取法的正确使用法的更多相关文章
- poj3320尺取法
Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is co ...
- poj3320(尺取法)
题目大意:给你一串数字,找出最小的能够覆盖所有出现过的数字的区间长度: 解题思路:依旧是尺取法,但要用map标记下出现过的书: 代码:别用cin输入: #include<iostream> ...
- poj3320 (尺取法)
n个数,求最小区间覆盖着n个数中所有的不相同的数字. 解题思路: AC代码: import java.util.HashMap; import java.util.HashSet; import ja ...
- KMP的正确使用法_x新疆网络赛Query on a string
Query on a string 题意,给定一个大字符串,给定一个小模式串,定义 两种不同的任务模式,分别是查询和更改: 查询对应区间内,有多少个匹配到位的数字: 修改某一位的某一个字母. 于是直觉 ...
- poj 2566"Bound Found"(尺取法)
传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...
- poj3061 poj3320 poj2566尺取法基础(一)
poj3061 给定一个序列找出最短的子序列长度,使得其和大于等于S 那么只要用两个下标,区间和小于S时右端点向右移动,区间和大于S时左端点向右移动,在这个过程中更新Min #include < ...
- 尺取法 poj3061 poj3320
尺取法就是反复推进区间的开头和结尾,来求满足条件的最下区间. poj3061 http://poj.org/problem?id=3061 给定一个都是正整数的序列,要我们求总和不小于S的连续子序列的 ...
- poj3061 Subsequence&&poj3320 Jessica's Reading Problem(尺取法)
这两道题都是用的尺取法.尺取法是<挑战程序设计竞赛>里讲的一种常用技巧. 就是O(n)的扫一遍数组,扫完了答案也就出来了,这过程中要求问题具有这样的性质:头指针向前走(s++)以后,尾指针 ...
- 【尺取法】POJ3061 & POJ3320
POJ3061-Subsequence [题目大意] 给定长度微n的数列整数及整数s.求出总和不小于s的连续子序列的长度的最小值.如果节不存在,则输出0. [思路] 尺取法五分钟裸裸裸~刷水刷出了罪恶 ...
随机推荐
- 内容显示分页数字分页 aspx
此处是aspx里面分页显示,数据层和业务层是由动软生成 当然,我们也可以可以利用listView实现分页ListView(高效分页) public partial class NewList : Sy ...
- mysql语句删除重复数据,保留一条;查询所有重复数据;查询重复数据的一条,
//显示重复的所有条 SELECT * FROM 表名 WHERE (字段1,字段2,...) IN (SELECT 字段1,字段2,...FROM 表名 GROUP BY 字段1,字段2,... H ...
- mysql mysqldump 本地数据库导入本地数据库的命令
C:\Users\Administrator>mysqldump -h localhost -P 3306 -u root -proot -n -R --triggers foryou |mys ...
- android sqlite 递归删除一棵子树
背景:android studio 3.0 GreenDao 目标:在android 中,如何做到递归删除某颗子树?? ======================================== ...
- [转]latex符号
常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LATEX2e 介绍”) 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(square root)的输入命令 ...
- C#访问修改符
修饰符可以指定访问的可见性,还可以指定其本质.(文章摘自<C#高级编程(第9版)>以及Microsoft) 1. 可见性修饰符 public:应用于所有类型或成员,即任何代码均可以访问该项 ...
- JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
1.page-->最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和con ...
- nrm—源管理工具
全局安装 npm install -g nrm 查看可选源 nrm ls 其中,带*的是当前使用的源,上面的输出表明当前源是hiknpm 切换源 nrm use taobao 新增源 nrm add ...
- 将腾讯视频客户端缓冲的文件转换为一个MP4格式文件
打开腾讯视频windows客户端,播放要下载的视频,逐步快进使其缓冲完毕: 按照下图所示,复制缓存路径: 在cmd.exe的界面中输入“cd C:\854456b6d5a187ff3c0f553918 ...
- 使用Java程序消费SAP Leonardo的机器学习API
以sap leonardo作为关键字在微信上搜索,能搜到不少文章.但是我浏览了一下,好像没有发现有从具体编程角度上来介绍的.所以我就贡献一篇. 需求 开发一个Java程序,用户可以指定一张图片,该Ja ...