poj 2566 Bound Found 尺取法
一、首先介绍一下什么叫尺取
过程大致分为四步:
1.初始化左右端点,即先找到一个满足条件的序列。
2.在满足条件的基础上不断扩大右端点。
3.如果第二步无法满足条件则到第四步,否则更新结果。
4.扩大左端点,并且回到第二步。
很明显如果要这样做,那么这个序列要是一个有顺序的序列,因为这样的话保证左端点不变,右端点一直向右延伸一定会使答案靠近结果。(可以看一道题理解一下)
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 10
3
10 2
-9 8 -7 6 -5 4 -3 2 -1 0
5 11
15 2
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
15 100
0 0
Sample Output
5 4 4
5 2 8
9 1 1
15 1 15
15 1 15
题意:
这道题是让找一段连续序列,保证找到的这一段序列的(所有数和的绝对值)很靠近那个输入。如果找出来的答案有多个,输出任意一个
题解:
因为这一个输入的n个数的序列不是有序的,是没有办法尺取的(可以想想为什么)
因为我们要找出来一段连续的序列,那么就可以利用前缀和。计算出前缀和之后,对他们排序就可以得到一个有序的序列
这样的话我们保证左端点不变的前提下,右端点向右扩展的话会导致这中间的差值就会越来越大,我们只需要找出来能使右端点减去左端点的值更接近答案的区间就可以(右端点减去左端点的值的几何意义就是左端点在原序列中序号和右端点在原序列中序号之间的和)
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<algorithm>
6 using namespace std;
7 const int maxn=100005;
8 const int INF=0x3f3f3f3f;
9 struct shudui
10 {
11 int first,second;
12 } p[maxn];
13 bool cmp(shudui x,shudui y)
14 {
15 return x.first<y.first;
16 }
17 int n,m;
18 void solve(int k)
19 {
20 int l = 0, r = 1, al, ar, av, minn =INF;
21 while (l<=n&&r<=n&&minn!=0)
22 {
23 int temp=p[r].first - p[l].first;
24 if (abs(temp - k) < minn)
25 {
26 minn = abs(temp - k);
27 ar = p[r].second;
28 al = p[l].second;
29 av = temp;
30 }
31 if (temp> k) //当temp>k之后就不用l++,因为之后的答案肯定不如之前的答案更优
32 l++;
33 else if (temp < k)
34 r++;
35 else
36 break;
37 if (r == l)
38 r++;
39 }
40 if(al>ar)
41 swap(al,ar);//因为al和ar大小没有必然关系()取绝对值,所以要交换
42 printf("%d %d %d\n", av, al+1, ar);
43 }
44 int main()
45 {
46 int k;
47
48 while(~scanf("%d%d",&n,&m))
49 {
50 if (!n&&!m) return 0;
51 p[0].second=p[0].first=0; //这一个初始化要放在里面
52 for (int i = 1; i <= n; i++)
53 {
54 scanf("%d", &p[i].first);
55 p[i].first += p[i - 1].first;
56 p[i].second = i;
57 }
58 sort(p, p + n + 1,cmp);
59 while (m--)
60 {
61 scanf("%d", &k);
62 solve(k);
63 }
64 }
65 return 0;
66 }
poj 2566 Bound Found 尺取法的更多相关文章
- POJ 2566 Bound Found(尺取法,前缀和)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5207 Accepted: 1667 Spe ...
- poj 2566 Bound Found 尺取法 变形
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2277 Accepted: 703 Spec ...
- poj 2566"Bound Found"(尺取法)
传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...
- POJ 2566 Bound Found 尺取 难度:1
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1651 Accepted: 544 Spec ...
- poj 2566 Bound Found(尺取法 好题)
Description Signals of most probably extra-terrestrial origin have been received and digitalized by ...
- poj 3061(二分 or 尺取法)
传送门:Problem 3061 https://www.cnblogs.com/violet-acmer/p/9793209.html 马上就要去上课了,先献上二分AC代码,其余的有空再补 题意: ...
- POJ 3061 Subsequence ( 尺取法)
题目链接 Description A sequence of N positive integers (10 < N < 100 000), each of them less than ...
- poj 3320 复习一下尺取法
尺取法(two point)的思想不难,简单来说就是以下三步: 1.对r point在满足题意的情况下不断向右延伸 2.对l point前移一步 3. 回到1 two point 对连续区间的问题求 ...
- POJ 3061 Subsequence ( 二分 || 尺取法 )
题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...
随机推荐
- 【Linux】java.io.IOException: error=24, Too many open files解决
linux系统中执行java程序的时候,如果打开文件超过了限制,就会报错: java.io.IOException: error=24, Too many open files 解决办法: 首先查看j ...
- 【ORA】ORA-32004: 问题分析和解决
今天做一个特殊的实验,需要重启数据库 数据库关闭没有问题 SQL> shutdown immediate; Database closed. Database dismounted. ORACL ...
- 误删除SAP ECC中的profile文件
环境:ECC6.0 EHP4 FOR ORACLE ON WINDWS X64下 今天在RZ10配置系统参数文件的时候,不小心错删除了instance profile文件,这下惨了,这是操作系统层级 ...
- Pytorch入门——手把手教你MNIST手写数字识别
MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...
- const关键字:终于拥有真正的常量声明语句
本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...
- linux自定义位置安装tomcat8.5
1 下载tomcat安装文件 下载地址:https://tomcat.apache.org/download-80.cgi 2 解压文件 tar -zxvf apache-tomcat-8.5.56 ...
- 微信小程序 发送模板消息的功能实现
背景 - 小程序开发的过程中,绝大多数会满足微信支付 - 那么,作为友好交互的体现,自然就会考虑到支付后的消息通知咯 - 所以,我的小程序项目也要求完成这个效果,so.分享一下自己的实现步骤,以方便道 ...
- Spring Security 实战干货:分布式对象SharedObject
1. 前言 在上一篇我们对AuthenticationManager的初始化的细节进行了分析,其中里面有一段代码引起了不少同学的注意: ApplicationContext context = htt ...
- windows激活密钥
密钥来源,微软官方 KMS 客户端安装密钥 | Microsoft Docs Windows Server 2008 R2 操作系统版本 KMS 客户端安装程序密钥 Windows Server 20 ...
- Bitter.Core系列三:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例模型创建
在具体数据库操作之前,我们先准备好四张表以及相对应数据库操作模型: 学生表,年级表,班级表,学分表.示例数据库表,如下代码(MSSQL 为例) --学生表 CREATE TABLE t_student ...