题意 : 给你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相关推荐

  1. 码农场 » POJ 2566 Bound Found 题解 《挑战程序设计竞赛》

    本题用的是取尺法,是难得的好题,不过题目数据似乎有些问题,取尺法的复杂度为O(k*n),很明显应该TLE,但是却过了. 而且,本题是想加排序之后才采用的取尺法. #include <iostre ...

  2. Bound Found POJ - 2566(尺取法)

    Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...

  3. Bound Found POJ - 2566(尺取法+前缀和创造区间变化趋势)

    题意: 给定一个数组和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行. 题目: Signals of most probably extra-terrestrial ...

  4. Bound Found POJ - 2566 (尺取+前缀和)

    题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性  没有特殊的特征 若对区间求 ...

  5. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  6. 备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)

    挑战程序设计竞赛(第2版)练习题 tips:难度(个人主观判断): 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的"动态规划" ...

  7. 寒假练习题解 第二周 1.25-1.31

    每日一练 1.25 Problem A Luxurious Houses 题意:给 n 个数 a[i],问使得 a[i] 为 [i,n] 最大值的时候需要给 a[i] 增加多少 简析:可以倒着扫一遍, ...

  8. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  9. 解题报告 (十三) 尺取法

    文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...

最新文章

  1. Python的串口操作库pyserial
  2. 乌克兰农贸市场现在接受比特币BCH等加密货币
  3. stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
  4. 【PP】生产发货仓位决定
  5. Arduino--DHT11温湿度传感器
  6. logback的使用和logback.xml详解[转]
  7. Spring 环境与profile(一)——超简用例
  8. 汇编语言之常见的汇编指令
  9. LeetCode 157. 用 Read4 读取 N 个字符
  10. 多位诺贝尔奖获得者推荐的精品力作:《大数据时代的调查师》
  11. 软件项目管理经验点滴总结
  12. Python爬虫学习简单入门(第四含scrapy安装)
  13. 辛普森悖论_辛普森悖论如何影响AB测试
  14. java 模板类 mock_mockj: 生成mock数据的利器,按照规则模板生成 mock 数据,mockjs的java实现。同时内置随机 random 一个对象的功能...
  15. jrtplib学习笔记1
  16. 高新技术企业认定领域细分有几项
  17. String ends with?
  18. Js放在head和body中的区别
  19. 研究方向确定:移动网络优化
  20. python如何计算累乘和累加

热门文章

  1. 联机重做日志的配置过程
  2. TeeChart经验总结 10.ZoomScroll
  3. 关于分页的一些经验。
  4. MyEclipse 7.5优化
  5. POJ3114强连通+spfa
  6. hdu3622 二分+2sat
  7. 两个整数相加减是否溢出
  8. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
  9. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
  10. 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )