poj3061 Subsequence

题目链接: http://poj.org/problem?id=3061

挑战P146。题意:给定长度为n的数列整数a0,a1,...,a(n-1)以及整数S,求出总和不小于S的连续子序列的长度的最小值,如果解不存在,则输出零。$10<n<10^5,0<a_i<=10^4,S<10^8$;

思路:尺取法,设起始下标s,截止下标e,和为sum,初始时s=e=0;若sum<S,将sum增加a(e),并将e加1,若sum>=S,更新t-s,并将sum减去a(s),sj增加1,再和S比较,重复该步骤,直接附上书上代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int x,a[100005];
cin>>x;
while(x--){
int s=0,t=0,sum=0,S,n,ans;
cin>>n>>S;
ans=n+1;
for(int i=0;i<n;i++)
cin>>a[i];
for(;;){
while(t<n&&sum<S){
sum+=a[t++];
}
if(sum<S)
break;
ans=min(ans,t-s);
sum-=a[s++];
}
if(ans>n)
cout<<0<<endl;
else cout<<ans<<endl; }
}

poj2566 Bound Found

题目链接:http://poj.org/problem?id=2566

题意:已知一个长度为n的整数序列和非负数t,求该序列中一个连续的子序列,使其和的绝对值最接近t,输出该序列的左右下标;

这题是《挑战》上尺取法部分的习题,暴力肯定会T,开始觉得尺取法不可做,看了下题解发现自己还是太菜了,稍微变下形就不会了,,,,

尺取法一般数列都是有序的,给的数列不是有序的,只要求出他们的前缀和再排个序就变成有序的了,用了一个结构体z[i]保存前缀和信息,z[i].x表示前i个数的和,由于排序后i会变化,故z[i].y记录初始的i,排序后即可使用尺取法更新最接近t值得左右下标,讲的应该比较清楚了哦->_->

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,k,a[100005];
struct Z{
int x;
int y;
}z[100005];
bool cmp(Z a,Z b){
return a.x<b.x;
}
int main(){
while(scanf("%d%d",&n,&k)&&(n!=0||k!=0)){
z[0].x=z[0].y=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
z[i+1].x=z[i].x+a[i];
z[i+1].y=i+1;
}
sort(z,z+n+1,cmp);
for(int i=0;i<k;i++){
int p;int s=0,t=1,temp,minn=0x3f3f3f3f,l,r,ans;
scanf("%d",&p);
while(s<=n&&t<=n){
temp=z[t].x-z[s].x;
if(abs(temp-p)<minn){
minn=abs(temp-p);
l=z[t].y;
r=z[s].y;
ans=temp;
}
if(temp>p)
s++;
else if(temp<p)
t++;
else break;
if(s==t)
t++;
} printf("%d %d %d\n",ans,min(l,r)+1,max(l,r));
} }
}

poj2100 Graveyard Design

题目链接:http://poj.org/problem?id=2100

题意:已知一个数n,问是否存在一个连续的自然数序列使他们的平方和为n,按序列长度从大到小输出序列的长度和整个序列

尺取法,和poj3061基本一样,由于输出要求,只要用个结构体记录下长度和起始下标即可。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Z{
long long int x,y,z;
}z[1000005];
int main(){
long long int ans=0,S,s=1,t=1,sum=0;
cin>>S;
for(;;){
while(sum<S){
sum+=t*t;
t++;
}
if(sum==S){
z[ans].x=t-s;
z[ans].y=s;
z[ans].z=t-1;
ans++;
}
sum-=s*s;
s++;
if(s*s>S) break;
}
if(ans==0)
cout<<0<<endl;
else {
cout<<ans<<endl;
for(int i=0;i<ans;i++){
cout<<z[i].x<<" ";
int j;
for( j=z[i].y;j<z[i].z;j++)
cout<<j<<" ";
cout<<j<<endl;
}
}
}

poj2739 Sum of Consecutive Prime Numbers

题目链接: http://poj.org/problem?id=2739

题意:已知一个数n,(2<=n<=10000);若n能表示成若干个连续的素数的和,则称n为consecutive prime numbers,问n有多少种表示方法;

思路:先将n以内的数筛选法打个素数表,再用尺取法判断即可;

#include<cstdio>
#include<iostream>
using namespace std;
int prime[10005],ans[10005]={0},is_prime[10005];
int main(){
int p=0;
for(int i=0;i<=10000;i++)
is_prime[i]=1;
is_prime[1]=is_prime[1]=0;
for(int i=2;i<=10000;i++){
if(is_prime[i]){
prime[p++]=i;
for(int j=2*i;j<=10000;j+=i)
is_prime[j]=false;
}
}
int s=0,t=0,sum=0;
for(;;){
while(t<10000&&sum<=10000){
sum+=prime[t++];
ans[sum]++;
}
sum=0;s++;t=s;
if(prime[s]>10000)
break;
}
int n;
while((cin>>n)&&n!=0){
cout<<ans[n]<<endl;
}
}

  

  

POJ 尺取法的更多相关文章

  1. POJ 3061 (二分+前缀和or尺取法)

    题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...

  2. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  3. POJ 3320 Jessica's Reading Problem 尺取法

    Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...

  4. POJ 3320 Jessica‘s Reading Problem(哈希、尺取法)

    http://poj.org/problem?id=3320 题意:给出一串数字,要求包含所有数字的最短长度. 思路: 哈希一直不是很会用,这道题也是参考了别人的代码,想了很久. #include&l ...

  5. 尺取法 poj 2566

    尺取法:顾名思义就是像尺子一样一段一段去取,保存每次的选取区间的左右端点.然后一直推进 解决问题的思路: 先移动右端点 ,右端点推进的时候一般是加 然后推进左端点,左端点一般是减 poj 2566 题 ...

  6. POJ 3320 尺取法(基础题)

    Jessica's Reading Problem Description Jessica's a very lovely girl wooed by lots of boys. Recently s ...

  7. 尺取法 POJ 3320 Jessica's Reading Problem

    题目传送门 /* 尺取法:先求出不同知识点的总个数tot,然后以获得知识点的个数作为界限, 更新最小值 */ #include <cstdio> #include <cmath> ...

  8. 尺取法 POJ 3601 Subsequence

    题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...

  9. POJ 3061 Subsequence 二分或者尺取法

    http://poj.org/problem?id=3061 题目大意: 给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. 思路: ...

随机推荐

  1. TVM 优化 ARM GPU 上的移动深度学习

    TVM 优化 ARM GPU 上的移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与桌面平台上所做的类似,在移动设备中使用 GPU 既有利于推理速度,也有利于能源 ...

  2. 点云配准的端到端深度神经网络:ICCV2019论文解读

    点云配准的端到端深度神经网络:ICCV2019论文解读 DeepVCP: An End-to-End Deep Neural Network for Point Cloud Registration ...

  3. 达芬奇架构NPU

    达芬奇架构NPU 达芬奇架构的核心优势是什么?如何更好地赋能麒麟990? 达芬奇架构,是华为自研的面向AI计算特征的全新计算架构,具备高算力.高能效.灵活可裁剪的特性,是实现万物智能的重要基础.具体来 ...

  4. 主成分分析法(PCA)原理和步骤

    主成分分析法(PCA)原理和步骤 主成分分析(Principal Component Analysis,PCA)是一种多变量统计方法,它是最常用的降维方法之一,通过正交变换将一组可能存在相关性的变量数 ...

  5. 性能监控之常见 Java Heap Dump 方法

    一.前言 在本文中,我们总结下抓 Java dump 的几种不同方法. Java Heap Dump 是特定时刻 JVM 内存中所有对象的快照.它们对于解决内存泄漏问题和分析 Java 应用程序中的内 ...

  6. 通过Z-Order技术加速Hudi大规模数据集分析方案

    1. 背景 多维分析是大数据分析的一个典型场景,这种分析一般带有过滤条件.对于此类查询,尤其是在高基字段的过滤查询,理论上只我们对原始数据做合理的布局,结合相关过滤条件,查询引擎可以过滤掉大量不相关数 ...

  7. Python3中列表、字典、元组、集合的看法

    文首,我先强调一下我是一个弱鸡码农,这个随笔是在我学习完Python3中的元组.字典.列表,集合这四种常见数据的数据类型的一些感想,如果有什么不对的地方欢迎大家予以指正.谢谢大家啦 回归正题:这篇随笔 ...

  8. noip2006 总结

    T1 能量项链 原题 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子 ...

  9. alert日志报错:ERROR: failed to establish dependency between database RACDB and diskgroup resource ora.DATA.dg

    一.打开数据库alert日志,发现有报错 ERROR: failed to establish dependency between database RACDB and diskgroup reso ...

  10. Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门

    方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...