【尺取法】POJ3061 & POJ3320
POJ3061-Subsequence
【题目大意】
给定长度微n的数列整数及整数s。求出总和不小于s的连续子序列的长度的最小值。如果节不存在,则输出0。
【思路】
尺取法五分钟裸裸裸~刷水刷出了罪恶感:(
基本做法:设置l和r代表当前区间[l,r],若S(l,r)<s,则 r++。若S(l,r)≥s,则 l++,直至S(l,r)<s。如果当前S(l,r)<s且r=n则退出。输出最小区间长度[l,r]即可。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN=+;
int num[MAXN],n,s; void solve()
{
scanf("%d%d",&n,&s);
for (int i=;i<=n;i++) scanf("%d",&num[i]);
int l=,r=,sum=num[],len=MAXN;
for (;;)
{
if (sum>=s)
{
len=min(len,r-l+);
sum-=num[l++];
}
else
{
if (r==n) break;
sum+=num[++r];
}
}
if (len==MAXN) puts("");
else printf("%d\n",len);
} int main()
{
int T;
scanf("%d",&T);
while (T--) solve();
return ;
}
POJ3320-Jessica's Reading Problem
【题目大意】
一个序列ai,其中ai可能相同。求最短的连续子序列长度,使得该子序列中包含所有的ai。
【思路】
由于ai可能非常大,先对ai进行离散化。用appear[a[i]]表示当前a[i]出现的次数。然后利用尺取法,sum表示当前区间中包含了几种不同的数,如果l右移而appear[a[l]]变为0则sum--,如果r右移而appear[a[r]]变为1则sum++。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=1e6+;
int appear[MAXN],p,a[MAXN],hash[MAXN],d; void init()
{
scanf("%d",&p);
for (int i=;i<=p;i++) scanf("%d",&a[i]),hash[i]=a[i];
sort(hash+,hash+p+);
d=unique(hash+,hash+p+)-(hash+);
for (int i=;i<=p;i++) a[i]=lower_bound(hash+,hash+d+,a[i])-hash;
} void solve()
{
memset(appear,,sizeof(appear));
appear[a[]]=;
int l=,r=,sum=,ans=MAXN;
for (;;)
{
if (sum>=d)
{
ans=min(ans,(r-l+));
appear[a[l]]--;
if (!appear[a[l++]]) sum--;
}
else
{
if (r==p) break;
appear[a[r+]]++;
if (appear[a[++r]]==) sum++;
}
}
printf("%d",ans);
} int main()
{
init();
solve();
return ;
}
【尺取法】POJ3061 & POJ3320的更多相关文章
- 尺取法 poj3061 poj3320
尺取法就是反复推进区间的开头和结尾,来求满足条件的最下区间. poj3061 http://poj.org/problem?id=3061 给定一个都是正整数的序列,要我们求总和不小于S的连续子序列的 ...
- 尺取法拓展——POJ3320
#include <iostream> #include <cstdio> #include <algorithm> #include <set> #i ...
- 尺取法——POJ3061
#include <iostream> //nlogn复杂度的写法 #include <cstdio> #include <algorithm> using nam ...
- poj3061 poj3320 poj2566尺取法基础(一)
poj3061 给定一个序列找出最短的子序列长度,使得其和大于等于S 那么只要用两个下标,区间和小于S时右端点向右移动,区间和大于S时左端点向右移动,在这个过程中更新Min #include < ...
- poj3061 Subsequence&&poj3320 Jessica's Reading Problem(尺取法)
这两道题都是用的尺取法.尺取法是<挑战程序设计竞赛>里讲的一种常用技巧. 就是O(n)的扫一遍数组,扫完了答案也就出来了,这过程中要求问题具有这样的性质:头指针向前走(s++)以后,尾指针 ...
- poj3061 Subsequence(尺取法)
https://vjudge.net/problem/POJ-3061 尺取发,s和t不断推进的算法.因为每一轮s都推进1所以复杂度为O(n) #include<iostream> #in ...
- POJ3320 尺取法的正确使用法
一.前言及题意: 最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书.蓝书,似乎都有些不尽如人意.这两天看到了日本人的白书,重新 ...
- POJ3061 尺取法
题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...
- poj3061尺取法
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...
随机推荐
- 【洛谷 P4542】 [ZJOI2011]营救皮卡丘(费用流)
题目链接 用最多经过\(k\)条经过\(0\)的路径覆盖所有点. 定义\(ds[i][j]\)表示从\(i\)到\(j\)不经过大于\(max(i,j)\)的点的最短路,显然可以用弗洛伊德求. 然后每 ...
- 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)
题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...
- HDU 1521 排列组合 (母函数)
题目链接 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB&qu ...
- 常见踩坑案例(一) subList引起FULLGC
计划真的赶不上变化,时间过得真快.废话不多说了,今天主要记录之前有同事遇到的一些坑分享出来. 一.封装类的应用会引起NPE异常 对于其他对象的应用,一般在使用之前会判断它是否为空,如果不为空才会使用它 ...
- C++显式类型转换
C++显式类型转换 (注:本文例程改编自<C++ Primer>) 关于类型转换,C++保留了C语言中的类型转换方式,并提供了4中新的类型转换方式.<Effective C++> ...
- C++之 extern C的作用详解
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C+ ...
- 用VIM查看编辑二进制文件
用VIM查看编辑二进制文件 vim可以很方便地编辑二进制文件,个人认为它比emacs的二进制编辑方式更好用.vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可 ...
- 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞
SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...
- Mysql自带profiling性能分析工具使用分享
1. show variables like '%profiling%';(查看profiling信息) 2. set profiling=1;(开启profiling) 3. 执行S ...
- ECharts图表tooltip显示时超出canvas图层解决方法
我们在做ECharts图表的时候可能会遇到tooltip显示时超出了canvas图层范围,并且被其它z-index较高的div容器遮盖,这是悬浮展示信息就看不全,我们根据官网文档的配置项查询发现con ...