POJ 2566(尺取法+前缀和排序)
来源:互联网 发布:怎么查看服务器端口 编辑:程序博客网 时间:2024/05/17 02:12
Description
You are given the sequence of n integers and the non-negative target t. You are to find a non-empty range of the sequence (i.e. a continuous subsequence) and output its lower index l and its upper index u. The absolute value of the sum of the values of the sequence from the l-th to the u-th element (inclusive) must be at least as close to t as the absolute value of the sum of any other non-empty range.
Input
Output
Sample Input
5 1-10 -5 0 5 10310 2-9 8 -7 6 -5 4 -3 2 -1 05 1115 2-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -115 1000 0
Sample Output
5 4 45 2 89 1 115 1 1515 1 15
题意:数列中有n个数字,给出k个数,做k次查询,求在数列中存在的区间[ left,right ],使得区间中数的和的绝对值与t最接近。
题解:基本思路:统计出前缀和,然后找到两段前缀和差的绝对值最接近t。 我们用尺取法,因为前缀和是无序,需要先将前缀和从小到大排好序,这样才能用尺取法推进查找记录最小值。 在建立前缀和时,建立编号记录下标,通过编号还原位置。
在处理前缀和排序时的有很强的技巧性。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
const int N = 100110;
const int inf = INT_MAX;
int v[N];
struct node
{
int id, sum;
} p[N];
int cmp(node a,node b)
{
return a.sum<b.sum;
}
int main()
{
int n, q;
while(scanf("%d %d", &n, &q),n||q)
{
for(int i=1; i<=n; i++)
{
scanf("%d", &v[i]);
}
int tmp;
p[0].sum=0;
p[0].id=0;
for(int i=1; i<=n; i++)
{
p[i].sum=p[i-1].sum+v[i];
p[i].id=i;
}
sort(p,p+n+1,cmp);
while(q--)
{
scanf("%d", &tmp);
int l=0, r=1, ans=inf, ansl=1, ansr=1;
while(r<=n)
{
int k1=min(p[l].id,p[r].id), k2=max(p[l].id,p[r].id);
int num=abs(p[r].sum-p[l].sum);
if(abs(ans-tmp)>=abs(num-tmp))
{
ansl=k1+1, ansr=k2;
ans=num;
}
if(num>tmp)
{
l++;
}
else if(num<tmp)
{
r++;
}
else if(num==tmp)
{
break;
}
if(r==l)
{
r++;
}
}
printf("%d %d %d\n",ans, ansl, ansr);
}
}
return 0;
}
- POJ 2566 Bound Found(前缀和排序 + 尺取法)
- POJ 2566(尺取法+前缀和排序)
- POJ 2566 Bound Found Time(尺取法—前缀和排序处理)
- POJ - 3061 Subsequence(前缀和+二分和尺取法)
- Bound Found(POJ-2566)(尺取法 and 前缀和)
- la2678(前缀和,二分/尺取法)
- poj--3061 Subsequence(前缀和 or 尺取法)
- 【poj 3061】Subsequence 【尺取法】or【前缀和+二分】
- POJ2566 ZOJ1964 Bound Found【前缀和+排序+尺取法】
- POJ_2566_前缀和&&尺取法
- poj3061(二分前缀和或者尺取法)
- POJ 2739 - Sum of Consecutive Prime Numbers(素数筛法+前缀和 / 尺取法)
- POJ 2566 尺取法
- POJ 2566 尺取法
- poj 2566 尺取法
- poj 2566 尺取法
- POJ - 2566 Bound Found(尺取法+排序)
- poj 2566 Bound Found(尺取法)
- <Pro ASP.NET MVC 5> - Note01
- DVB-SI理解入门指南(一)(二)(三)
- 微信公众号开发---微信支付(JS API) JAVA
- JUnit4 执行测试时报initializationError错误
- spring视图国际化locale
- POJ 2566(尺取法+前缀和排序)
- 【Redis】事务和持久化
- viewport属性
- 如何在java中使用ConcurrentHashMap
- 微信公众号开发---红包高级接口(java)
- 二.创建版本库
- 全套支付宝系统架构(内部架构图),推荐收藏学习!
- 从源码角度认识ArrayList,LinkedList与HashMap
- android 沉浸式状态栏