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. [思路] 尺取法五分钟裸裸裸~刷水刷出了罪恶 ...
随机推荐
- java注解相关
本文参考很多大神的文档,特别再次表示感谢分享!! 1.何为注解? 概念:注解(Annotation),也叫元数据.一种代码级别的说明. 它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在 ...
- 基于jeesit下的工作流开发步骤
首先jeesit是开源的OA系统,采用的框架是springMVC和mybatis,采用shiro安全验证. 1.新建流程所属表: 在数据库新建所需工作流的表之后,登录jeesit系统,在“代码生成”- ...
- 索引是否也能提高UPDATE,DELETE,INSERT速度 解释
insert 不会提高,insert 用不到索引,只会增加维护索引的时间. update ,更新索引列不会提高,少量更新非索引列,会有提高 : 更新索引列,索引要重新维护,更新非索引列,倒是没什么影响 ...
- hadoop2.4 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
在Ubuntu上安装完hadoop2.4以后,使用以下命令: hadoop fs -ls // :: WARN util.NativeCodeLoader: Unable to load native ...
- FTP添加虚拟目录(图)
设置 访问效果 可以看到有这个文件:
- [Rails学习之路]Rails文件结构与路由
约定优于配置和RESTful是Ruby on Rails十分推崇的哲学.在一个默认的RESTful的Rails项目中,使用资源和HTTP动词来帮助组织项目. 假如有一个使用scaffold创建的Rai ...
- NSAutoreleasePool & thread
https://developer.apple.com/documentation/foundation/nsautoreleasepool An object that supports Cocoa ...
- js 实现纯前端将数据导出excel两种方式,亲测有效
由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,兼容chrome没问题,其他还没有测试过 通过将json遍历进行字符串拼接,将字符串输出到csv文件,输出的文件不会再是 ...
- HTML 5.1 的 14 个新特性(含使用案例)
HTML5 属于万维网联盟 (W3C), 这个组织为整个网络界提供了标准,如此形成的协议可在全世界通行.在 2016 年 11 月, W3C 对长期行使的 HTML 5 标准进行了更新,它是2年内的第 ...
- 2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。
package com.swift; import java.util.Scanner; public class PToP { public static void main(String[] ar ...