POJ2566 尺取法巧解

2023-10-12 02:08
文章标签 取法 poj2566 巧解

本文主要是介绍POJ2566 尺取法巧解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 100050
#define INF 2000000010//数要开大一点避免溢出
int a[N],ans,n,t,k;
struct Node
{int v,id;
}sum[N];
bool cmp(Node a,Node b)
{return a.v<b.v;
}void solve(int a[])
{ans=INF;int l=0,r=1;int anss,ansl,ansr;while(l<=n&&r<=n){int w=abs(sum[r].v-sum[l].v);//前n个数的和相减,结果一定是连续的。int q=abs(w-t);if(q<ans){anss=w;ans=q;ansl=sum[l].id;//ansl为实际a数组的边界,l,r为sum数组的左右端点ansr=sum[r].id;}if(w>t) l++;else if(w<t) r++;else break;if(l==r) r++;}if(ansl>ansr) swap(ansl,ansr);printf("%d %d %d\n",anss,ansl+1,ansr);
}int main()
{while(~scanf("%d %d",&n,&k)&&(n+k)){sum[0].v=0;sum[0].id=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i].v=sum[i-1].v+a[i];sum[i].id=i;}sort(sum,sum+1+n,cmp);while(k--){scanf("%d",&t);solve(a);}}return 0;
}
//尺取法必须在单调数组中才能使用,所以要把a数组前i个数的和求出来进行排序。注意要有sum[0]=0,因为要计算单独一段的绝对值的和

这篇关于POJ2566 尺取法巧解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192469

相关文章

CF #364 (Div. 2)(C. They Are Everywhere 尺取法)

题目链接 题目描述的是抓取精灵,转化一下,就是问在一个长度是n的字符串里面,你选择最短的字串,使得这个字串包涵该字符串中所有的字母至少一次。 假设我们知道区间[s,t]的不同字母个数,那么可以计算出[s+1,t1],那么t1>=t, 也就是直接尺取法搞一下就好了 #include<cstdio>#include<algorithm>#include<iostream>#include<

【算法模板】基础:尺取法

尺取法(Sliding Window Technique),也叫滑动窗口法,是一种常见的算法思想,主要用于在一维数组或字符串中寻找满足某种条件的子数组或子串。它的核心思想是通过维护一个可变的窗口来遍历数组或字符串,从而有效地减少问题的时间复杂度。 算法思想 尺取法的核心思想是: 维护一个窗口:在数组或字符串上维护一个固定或可变的窗口,这个窗口可以看作是两个指针(通常是 left 和 r

Atcoder - 4142 尺取法,位运算(适合难度:普及+/提高-)

Atcoder - 4142 尺取法,位运算(适合难度:普及+/提高-) 异或不懂的参考位运算 if a ^ b ^ c < a + b + c 说明a ^ b <= a + b \qquad 枚举一个左端点,然后利用双指针计俩来滑动右端点来找到最大的满足条件的右端点。解法和UVA1121是很相似的,都是尺取法。 #include <iostream>#include <

线性结构——尺取法

【概述】 尺取法,顾名思义,就是像尺子一样一段一段的取,简单来说,尺取法就是返回推进区间开头和结尾,求满足条件的最小区间的方法。 一般在以下两种情况使用尺取法: 给定一个有序递增数组,在数组中找到满足条件的区间给定长度为 n 的数列以及整数 s,求出不小于 s 的连续子序列的长度的最小值,即最优连续子序列问题 【基本思路】 尺取法本质上也是一种模拟,常用于解决寻找区间和问题。 假设有一

尺取法知识点讲解

一、固定长度的情况: 最小和(sum)   输入N个数的数列,所有相邻的M个数的和共有N-M+1个,求其中的最小值。 输入格式 第1行,2个整数N,M,范围在[3…100000],N>M。 第2行,有N个正整数,范围在[1…1000]。  输出格式 1个数,表示最小和。  输入/输出例子1 输入: 6 3 10 4 1 5 5 2 输出: 10 【方法一】:枚举开始点,

蓝桥杯---试题 算法提高 分割项链(尺取法)

试题 算法提高 分割项链 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   两个强盗刚刚抢到一条十分珍贵的珍珠项链,正在考虑如何分赃。由于他们不想破坏项链的美观,所以只想把项链分成两条连续的珍珠链。然而亲兄弟明算账,他们不希望因为分赃不均导致不必要的麻烦,所以他们希望两条珍珠链的重量尽量接近。于是他们找到了你,希望让你帮忙分赃。   我们认为珍珠项链是由n颗不同的珍珠组成的,

《挑战程序设计竞赛》3.2.1 常用技巧-尺取法 POJ3061 3320 2566 2739 2100(1)

POJ3061 http://poj.org/problem?id=3061 题意 给定长度为n的整数数列以及整数S,求出总和不小于S的连续子序列的长度的最小值,如果解 不存在,输出0. 思路 如果用二分法: 先求出sum[i],从第1个数到第i个数的区间和,每次固定一个开始查找的起点sum[i], 然后采用二分查找找到 sum[i] + S 的位置,区间长度即为(末位置-(起始位置-

BZOJ 2079 [Poi2010]Guilds 巧解

Description Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处。这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市应该做到: 1:有这个工会的办事处或 2:和另外一个符合1条件的城市有马路直接相连。(也就是每个城市必须是YYD的公会,但是又和FSR的公会的城市相连,或者是FSR的,和YYD的城市

滑动窗口(尺取法)

滑动窗口(尺取法) 算法含义: 在解决关于区间特性的题目时保存搜索区间左右端点,然后根据实际要求不断更新左右端点位置的算法 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) 在历年真题中,滑动窗口主要有求追偿不重复子串和模拟优先队列求区间最值两个作用 一、求最长不重复字串 不重复子串:字符串的字串中不包含重复字符的字串

【尺取法】POJ 3061:Subsequence

一、题目内容 POJ 3061 原题地址 二、题意解释 从给定序列里找出区间和大于等于S的最小区间的长度。 三、代码及注释 #include<cstdio>#include<algorithm>using namespace std;//poj3061,³ÌÐòÉè¼ÆP148int cn,n,S;int a[1000005];int sum[1000005];void