【尺取法】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 ...
随机推荐
- Windows Live Writer博客草稿迁移的一种解决方案
作为一个苦逼的码农,喜欢写博客做总结是很正常的事,写博客写的久的人都接触过各种客户端工具,最流行的就是Windows Live Writer了. 作为一个苦逼的码农,换电脑也是很经常的事,经常会出现一 ...
- php之复制文件——php经典实例
php之复制文件——php经典实例 <?php function dirCopy($dir1,$dir2){ //判断是否目录存在 if(!file_exists($dir2) || !is_d ...
- linux ip白名单、防火墙白名单 设置
http://blog.csdn.net/catoop/article/details/50476099 登录信息在 /var/log/secure linux ip白名单 配置文件:/etc/hos ...
- java类中访问属性
package first; public class for_protect { private int age=10; int number = 100; public void show(){ ...
- linux wc命令的作用。
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...
- 保护眼睛(改变窗口颜色和Pdf背景颜色)
保护眼睛(改变窗口颜色和Pdf背景颜色) 昨天用了一个好朋友告诉我的保护眼睛的方法,效果很不错哦-- 今天告诉大家,一起爱护偶们明亮的眼睛吧!!! 首先需要改一下设置,如果常常用电脑很容易 ...
- tomcat打开gzip、配置utf-8
在部署描述文件中配置如下内容:(web.xml) 打开gzip compression="on"配置utf-8 URIEncoding="UTF-8" < ...
- ajax跨域的解决办法
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- HDU 2894 DeBruijin (数位欧拉)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2894 题目大意:旋转鼓的表面分成m块扇形,如图所示(m=8).图中阴影区表示用导电材料制成,空白区用绝 ...
- js + -操作符
js + 举例说明最有效了... "11"+1='111' "11"+'1'="111" 11+1=12 大概的感觉就是+操作符会优先输入S ...