一、前言及题意:

最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书、蓝书,似乎都有些不尽如人意。这两天看到了日本人的白书,重新读了一遍,其中若干章节写的非常务实也实践起来相当实用,于是这就是白书上面一道推荐的题目,用于训练尺取法的例题。考虑到最近老是读错题,所以就慢慢习惯于首先把个题目翻译成中文之后在进行解读:

杰西卡是个非常可爱的女孩子,因而有若干男孩子追她,最近他的考试要到了,她需要花相当多部分的时间在这件事情上面,吐过他想通过考试,那么她就必须把所有的只是点都熟悉透,但是写教科书的人似乎十分在意一些奇怪的东西,于是他将将有的知道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 尺取法的正确使用法的更多相关文章

  1. poj3320尺取法

    Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is co ...

  2. poj3320(尺取法)

    题目大意:给你一串数字,找出最小的能够覆盖所有出现过的数字的区间长度: 解题思路:依旧是尺取法,但要用map标记下出现过的书: 代码:别用cin输入: #include<iostream> ...

  3. poj3320 (尺取法)

    n个数,求最小区间覆盖着n个数中所有的不相同的数字. 解题思路: AC代码: import java.util.HashMap; import java.util.HashSet; import ja ...

  4. KMP的正确使用法_x新疆网络赛Query on a string

    Query on a string 题意,给定一个大字符串,给定一个小模式串,定义 两种不同的任务模式,分别是查询和更改: 查询对应区间内,有多少个匹配到位的数字: 修改某一位的某一个字母. 于是直觉 ...

  5. poj 2566"Bound Found"(尺取法)

    传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...

  6. poj3061 poj3320 poj2566尺取法基础(一)

    poj3061 给定一个序列找出最短的子序列长度,使得其和大于等于S 那么只要用两个下标,区间和小于S时右端点向右移动,区间和大于S时左端点向右移动,在这个过程中更新Min #include < ...

  7. 尺取法 poj3061 poj3320

    尺取法就是反复推进区间的开头和结尾,来求满足条件的最下区间. poj3061 http://poj.org/problem?id=3061 给定一个都是正整数的序列,要我们求总和不小于S的连续子序列的 ...

  8. poj3061 Subsequence&&poj3320 Jessica's Reading Problem(尺取法)

    这两道题都是用的尺取法.尺取法是<挑战程序设计竞赛>里讲的一种常用技巧. 就是O(n)的扫一遍数组,扫完了答案也就出来了,这过程中要求问题具有这样的性质:头指针向前走(s++)以后,尾指针 ...

  9. 【尺取法】POJ3061 & POJ3320

    POJ3061-Subsequence [题目大意] 给定长度微n的数列整数及整数s.求出总和不小于s的连续子序列的长度的最小值.如果节不存在,则输出0. [思路] 尺取法五分钟裸裸裸~刷水刷出了罪恶 ...

随机推荐

  1. 安装xenserver过程中出现的问题

    运行环境:win10系统,神舟战神z7m-KP7GT型号笔记本,VMWare虚拟机,XenServer7.2.0,XenCenter7.2.0 5月22日下午安装上xenserver虚拟机,发现虚拟机 ...

  2. Josn转换

    也是搬的,大家勿喷,贴出来只为了自己记忆查找 需要引用 System.Web.Extensions.dll 这个类库 命名空间: System.Web.Script.Serialization 数据结 ...

  3. i++ ++i i=i+1 和i+=1

    这几个运算符的差别总是过一段时间就爱搞混,每次需要百度,还是自己记录一下方便查阅. int i=0; System.out.println(i++); 输出:0 int i=0; System.out ...

  4. 做一个vue模态弹出框如何

    运用的知识点包括: 路由的配置 插槽 vue的过渡动画 路由重定向 router/index.js里面配置路由 import Vue from 'vue' import Router from 'vu ...

  5. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解

    1.(function($){...})(jQuery); (1).原理:       这实际上是匿名函数,如下: function(arg){...} 这就定义了一个匿名函数,参数为arg:而调用函 ...

  6. thinkphp简易搜索

    需求: 用户输入关键词,选项卡的每个选项输出一个分类的列表内容,分类有文章.ppt.学习. 实现过程: 视图中用户输入的关键词post给控制器,控制器对这个关键词做三次模糊查询处理,因为是三个分类对应 ...

  7. Java static修饰符小记

    首先我们明确一点:java是一个纯面向对象的编程语言,它的每一个文件都视为一个类,当我们创建一个对象的时候,就是在调用一个文件,那么这个时候,这个文件(类)里的一些东西,它是需要通过对象来使用或访问, ...

  8. 解决IE下面诡异地使用quickrIE5模式打开页面的有关问题

    解决IE下面诡异地使用quickrIE5模式打开页面的有关问题 <!doctype html public "-//w3c//dtd html 4.01 transitional//e ...

  9. Java生成不重复的随机数

    public class test { public static int[] Randoms(int number) { Random rand = new Random(); //创建一个新随机数 ...

  10. World Wind Java开发之三 显示状态栏信息(转)

    http://blog.csdn.net/giser_whu/article/details/40920315 先来看下本篇博客索要达到的效果: 找到源码下的gov.nasa.worldwind.ut ...