当前位置: 首页 > news >正文

POJ 2566 Bound Found(尺取法+前缀和)

题目链接

在这里插入图片描述
1.题目大意:给定一个序列,包含n个整数(1<=n<=100000),以及一个整数t(0<=t<=1000000000)。求一段子序列,使它的区间和最接近t。输出该段子序列之和及左右端点

2.刚刚接触尺取,做了两道基础题,感觉尺取也不过如此…打脸来的就是这么快,之前的题目序列都是正数,但是现在该题有正数有负数,按照POJ3061的思路去写,怎么都调不好,惨兮兮

3.原来,仔细思考一下,我们设置的双指针在不断向后滑动的过程中,如果不能保证滑动区间的单调递增性,那么就会出现r指针也要左移的局面,但是不可以,r指针生来就是一往无前冲锋的勇士,没有撤退可言 。因此,我们需要换个角度保证单调性。此类题目操作的都是序列的一段区间,还能如何表示这段区间呢?前缀和之差!对于区间[i,j]的和,等于前缀和sum[j]-sum[i-1]。那么我们就先求出所有前缀和,接着对前缀和排序,注意要保存之前的序号,因为我们需要表示答案区间。因为前缀和排序后保证了滑动区间的单调性,而任何一个序列的子区间都能被两个前缀和之差表示,因此这个思路符合预期结果

4.还有一点需要注意的是,因为sum[j]-sum[i-1]表示的是[i,j],因此我们需要将下标为0的id和sum都设置为0。此外在最后得到的答案左区间都加一

5.样例的第一组数据有毒,答案确实该是"5 4 4"但是我怎么都调不出来,其他的也都对,抱着侥幸心理交了竟然过了,我人傻了…去网上看其他人的题解也都是这个样子,真的牛批

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
#define INF 0x7fffffff
const int maxn=1e5+10;
typedef long long ll;
struct node{
    int id,sum;
}a[maxn];

bool cmp(node &p,node &q){
    return p.sum<q.sum;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,k,t,x,l,r,lans,rans,ans,len;
    while(cin>>n>>k){
        if(!n && !k) break;
        a[0].id=a[0].sum=0;
        for(int i=1;i<=n;i++){
            cin>>x;
            a[i].id=i;
            a[i].sum=x+a[i-1].sum;
        }
        sort(a,a+1+n,cmp); //[0,n]排序
        while(k--){
            cin>>t;
            l=0,r=1,len=INF;  //len表示绝对值之差
            while(r<=n){
                int cur=a[r].sum-a[l].sum;
                if(abs(cur-t)<len){
                    lans=a[l].id;
                    rans=a[r].id;
                    len=abs(cur-t);
                    ans=cur;
                }
                if(cur<t) r++;
                else if(cur>t) l++;
                else break;
                if(l==r) r++; //R至少比L大1,因为前缀和的缘故
            }
            if(lans>rans) swap(lans,rans); //id是乱序的
            cout<<ans<<" "<<lans+1<<" "<<rans<<endl;
        }
    }
    return 0;
}

相关文章:

  • Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  • HDU5358 First One(尺取法+数学)
  • Code Jam 2020 Qualification Round
  • Android开发指南-用户界面-通用布局对象
  • UVa1471 Defense Lines(LIS变形)
  • 计蒜客43467 Canyon Crossing(二分答案+多队列bfs)
  • 三句代码调整进程优先级
  • UVa714 Copying Books(二分答案+贪心)
  • 《程序员羊皮卷》成为电子工业出版社本周重点推荐图书
  • UVa12627 Erratic Expansion(递归/找规律)
  • 《金牌网管师》——10年的沉淀,18年的积累
  • 2020 CodeJam Round 1A
  • 如何更换Android模拟器界面
  • 2019 ICPC Latin American Regional Contests 计蒜客重现
  • youtube weburl后缀
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android组件 - 收藏集 - 掘金
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Computed property XXX was assigned to but it has no setter
  • ES6系列(二)变量的解构赋值
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • go语言学习初探(一)
  • leetcode46 Permutation 排列组合
  • Python 基础起步 (十) 什么叫函数?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Selenium实战教程系列(二)---元素定位
  • 大数据与云计算学习:数据分析(二)
  • 理解在java “”i=i++;”所发生的事情
  • 数组大概知多少
  • 探索 JS 中的模块化
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 2017年360最后一道编程题
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​插件化DPI在商用WIFI中的价值
  • ​水经微图Web1.5.0版即将上线
  • (39)STM32——FLASH闪存
  • (BFS)hdoj2377-Bus Pass
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四) 虚拟摄像头vivi体验
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core使用ef 6
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET构架之我见
  • .NET建议使用的大小写命名原则
  • .ui文件相关
  • @synthesize和@dynamic分别有什么作用?
  • [1204 寻找子串位置] 解题报告
  • [ARC066F]Contest with Drinks Hard
  • [C++]:for循环for(int num : nums)