POJ 2566 Bound Found
题意 : 给你n个数字,这些数字可正可负,再给你个数字t,
求在这个数列中一个连续的子序列,和的绝对值 与t相差最小;
数据范围较大, 考虑数字没有负数的情况,
能够想到用尺取法解决, (关于尺取法, 自己感受一下这东西的奇妙, 不好说, 理解了之后也没什么好说, 实现主要是首尾指针的移动), 那么增加了负数之后, 发现题目中要的是序列的绝对值, 发现直接排序前缀和即使用后面的前缀和减去前面的前缀和, 也没有关系;
但主要需要注意的是本题细节比较烦, 在POJ上WA了3,4次, 这里提示一下
注意如果给出的值为0时的处理, 还有就是自己多想几组小数据来调试, 调的很恶心, 但也很享受, 适合做尺取的好题
/*
*题意:给你n个数字,这些数字可正可负,再给你个数字t,
*求在这个数列中一个连续的子序列,和的绝对值 与t相差最小
* ————Galaxy TODO
*/
#include <cstdio>
#include <algorithm>typedef long long LL;const int N = 1e5 + 10;
#define C c = getchar()
#define rep(i, s, t) for(int i = s; i <= t; ++i)LL abs(LL x) {return x>0?x:-x;}
int read(int x=0, int t=1) {char C;while(c<'0' || c>'9') {if(c=='-') t=-1; C;}while(c>='0' && c<='9') x = x*10 + c-'0', C;return x*t;
}struct Sum_tot{LL sum; int rk;//Sum_tot(int _sum, int _rk) {sum = _sum; rk = _rk;}bool operator < (const Sum_tot& rhs) const{return sum < rhs.sum;}
}P[N];int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("res.out", "w", stdout);
#endifint n, T; LL S;while(scanf("%d%d", &n, &T) == 2 && n+T) {P[0].sum = 0, P[0].rk = 0;rep(i, 1, n) P[i] = ((Sum_tot) {P[i-1].sum+read(), i});std :: sort(P, P+n+1);// rep(i, 0, n) printf("%lld%c", P[i].sum, i^n?' ':'\n');while(T--) {scanf("%lld", &S);int ansl=n, ansr=n;int l = n-1, r = n;LL res = 1LL << 62;while(r > l) {// printf("%d %d__debug1\n", l, r);while(P[r].sum - P[l].sum <= S && l >= 0) { if(abs(P[r].sum-P[l].sum-S) < abs(S-res)) {res = P[r].sum - P[l].sum;ansl = P[l].rk, ansr = P[r].rk;}--l;}if(l < 0) break;// printf("%d %d__debug2\n", l, r);while(P[r].sum - P[l].sum >= S && r > l) { if(P[r].sum-P[l].sum-S < abs(res-S)) {res = P[r].sum - P[l].sum;ansl = P[l].rk, ansr = P[r].rk;}--r;}if(r < 0) break;if(l == r) --l;if(l < 0) break;// printf("%d %d__debug3\n", l, r);if(res == S) break;}if(ansl+1 > ansr) std::swap(ansl, ansr);printf("%lld %d %d\n", res, ansl+1, ansr);}}return 0;
}
//XXX
转载于:https://www.cnblogs.com/pbvrvnq/p/8530155.html
POJ 2566 Bound Found相关推荐
- 码农场 » POJ 2566 Bound Found 题解 《挑战程序设计竞赛》
本题用的是取尺法,是难得的好题,不过题目数据似乎有些问题,取尺法的复杂度为O(k*n),很明显应该TLE,但是却过了. 而且,本题是想加排序之后才采用的取尺法. #include <iostre ...
- Bound Found POJ - 2566(尺取法)
Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...
- Bound Found POJ - 2566(尺取法+前缀和创造区间变化趋势)
题意: 给定一个数组和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行. 题目: Signals of most probably extra-terrestrial ...
- Bound Found POJ - 2566 (尺取+前缀和)
题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性 没有特殊的特征 若对区间求 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- 备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)
挑战程序设计竞赛(第2版)练习题 tips:难度(个人主观判断): 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的"动态规划" ...
- 寒假练习题解 第二周 1.25-1.31
每日一练 1.25 Problem A Luxurious Houses 题意:给 n 个数 a[i],问使得 a[i] 为 [i,n] 最大值的时候需要给 a[i] 增加多少 简析:可以倒着扫一遍, ...
- [kuangbin]各种各样的题单
[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...
- 解题报告 (十三) 尺取法
文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...
最新文章
- Python的串口操作库pyserial
- 乌克兰农贸市场现在接受比特币BCH等加密货币
- stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
- 【PP】生产发货仓位决定
- Arduino--DHT11温湿度传感器
- logback的使用和logback.xml详解[转]
- Spring 环境与profile(一)——超简用例
- 汇编语言之常见的汇编指令
- LeetCode 157. 用 Read4 读取 N 个字符
- 多位诺贝尔奖获得者推荐的精品力作:《大数据时代的调查师》
- 软件项目管理经验点滴总结
- Python爬虫学习简单入门(第四含scrapy安装)
- 辛普森悖论_辛普森悖论如何影响AB测试
- java 模板类 mock_mockj: 生成mock数据的利器,按照规则模板生成 mock 数据,mockjs的java实现。同时内置随机 random 一个对象的功能...
- jrtplib学习笔记1
- 高新技术企业认定领域细分有几项
- String ends with?
- Js放在head和body中的区别
- 研究方向确定:移动网络优化
- python如何计算累乘和累加
热门文章
- 联机重做日志的配置过程
- TeeChart经验总结 10.ZoomScroll
- 关于分页的一些经验。
- MyEclipse 7.5优化
- POJ3114强连通+spfa
- hdu3622 二分+2sat
- 两个整数相加减是否溢出
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
- 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )