POJ 2566 Bound Found(前缀和排序 + 尺取法)
2015-07-27 14:10
316 查看
题目链接:http://poj.org/problem?id=2566
题意:对一个长度为n的数列,做k次查询,每次查询一个数t,求原数列中的一个子区间[l, r],使得该子区间的和的绝对值最接近t。
思路:在原数列开头添加一个0,处理好现数列a
的前缀和pre
。则原问题转化为在前缀数组中求2个数pre[i],pre[j]的差的绝对值最接近t的。对于每次找到的2个下标分别为i和j的2个数,所对应a的区间为[min(i, j) + 1, max(i, j)]。
那么将前缀和数组排序后,即可用尺取法得到最接近的值。
注意的是:排序时需要保留原来的下标值,以便于求区间。
代码如下
题意:对一个长度为n的数列,做k次查询,每次查询一个数t,求原数列中的一个子区间[l, r],使得该子区间的和的绝对值最接近t。
思路:在原数列开头添加一个0,处理好现数列a
的前缀和pre
。则原问题转化为在前缀数组中求2个数pre[i],pre[j]的差的绝对值最接近t的。对于每次找到的2个下标分别为i和j的2个数,所对应a的区间为[min(i, j) + 1, max(i, j)]。
那么将前缀和数组排序后,即可用尺取法得到最接近的值。
注意的是:排序时需要保留原来的下标值,以便于求区间。
代码如下
#include <iostream> #include <stdio.h> #include <string> #include <string.h> #include <algorithm> #include <math.h> using namespace std; const int N = 1e5 + 10; const int INF = 0x7fffffff; struct Presum { int sum; int id; }; int n, k; int a ; Presum pre ; bool cmp(Presum a, Presum b) { return a.sum < b.sum; } int main() { while (scanf("%d%d", &n, &k) != EOF && n && k) { pre[0].sum = 0; pre[0].id = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); pre[i].sum = pre[i - 1].sum + a[i]; pre[i].id = i; } sort(pre, pre + n + 1, cmp); for (int i_q = 0; i_q < k; i_q++) { int t; scanf("%d", &t); int ansl, ansr, ans; int l = 0, r = 1; int Min = INF; while (r <= n) { int sub = pre[r].sum - pre[l].sum; if (abs(sub - t) < Min) { Min = abs(sub - t); ansl = min(pre[l].id, pre[r].id) + 1; ansr = max(pre[l].id, pre[r].id); ans = sub; } if (sub < t) r++; else if (sub > t) l++; else break; if (l == r) r++; } printf("%d %d %d\n", ans, ansl, ansr); } } return 0; }
相关文章推荐
- DropDownList 获取不了选择的值 这种错误
- 查看文件被哪个进程lock住
- AM335x(TQ335x)学习笔记——触摸屏驱动编写
- svn---安装、启动、关闭
- ${pageContext.request.contextPath}和request.contextPath的区别 分类: jsp el表达式 2013-07-17 15:50 7184人阅读 评论
- [转]RecyclerView初探
- js正则表达式之中文验证(转)
- [C++]类的定义 class
- Linux_多核系统下绑定进程或线程到指定CPU_核执行
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第八章 Foudation Kit 介绍
- zookeeper使用场景
- JS 动画
- 试用友盟SDK实现Android分享微信朋友圈
- [转]Web攻击与防护
- AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
- 冒泡排序算法原理及JAVA实现
- 快快快!27个提升效率的iOS开源库推荐
- 计算程序运行时间(time_t, clock_t)
- vs2015升级后台mvc视图编辑器默认不是razor视图引擎问题
- 分布计算系统学习随笔 第五章同步和互斥