UVALive2678

http://122.207.68.93:9090/csuacmtrain/problem/viewProblem.action?id=453§

【题目描述】:n个正整数组成的序列。给定整数S,求长度最短的连续序列,使他们的和大于等于S。

【算法分析】:

【二分】:

全是正整数,保证取的连续序列长度越长,和越可能大于等于S,所以满足二分的单调递增的条件,而这里,我们要找的最优解是最小的长度,就是和刚刚好大于等于S的区间长度。

【区间和优化到O(N)】:

使用C[i]数组,做差求和。方法不细说。要求自己,以后遇到区间求和问题,自然就要想到这个。

【运筹分析】:

决策方案:所有区间段,sigm(n+(n-1).......+1) == O(n^2)注意n<=10^5

限制条件:累和大于等于S

最优评判标准:区间长度最小

【完整代码】:

 1 #include<iostream>
 2
 3 #include<stdio.h>
 4
 5 #include<string.h>
 6
 7 #include<algorithm>
 8
 9 #include<stdlib.h>
10
11 #include<math.h>
12
13 #include<queue>
14
15 #include<vector>
16
17 #include<map>
18
19 #define MAXN 100000+5
20
21 #define MAXM 20000+5
22
23 #define oo 9556531
24
25 #define eps 0.000001
26
27 #define PI acos(-1.0)//这个精确度高一些
28
29 #define REP1(i,an) for(int i=0;i<=(n);i++)
30
31 #define REP2(i,n) for(int i=1;i<=(n);i++)
32
33 using namespace std;
34
35 //这道题不是dp,而是二分,一是因为dp本身会超时,二是连续的状态是单调递增的
36
37 int A[MAXN];
38
39 int C[MAXN];
40
41 int n,s;
42
43 bool isok(int l)
44
45 {
46
47     for(int i=l;i<=n;i++)
48
49     if(C[i]-C[i-l]>=s) return true;//优化到O(n)
50
51     return false;
52
53 }
54
55 int main()
56
57 {
58
59     while(cin>>n>>s)
60
61     {
62
63         C[0]=0;
64
65         for(int i=1;i<=n;i++)
66
67         {
68
69             cin>>A[i];
70
71             C[i]=C[i-1]+A[i];
72
73         }
74
75         int l=1,r=n+1;
76
77         while(l<r)//边界条件,保证能够跳出循环,找不到极值也可,画状态图确定
78
79         {
80
81             int m=(l+r)/2;
82
83             if (isok(m)) r=m;else l=m+1;//根据除2取左的特点,保证能取到极值点
84
85         }
86
87         if (isok(l)) cout<<l<<endl;else cout<<0<<endl;
88
89     }
90
91     return 0;
92
93 }

【关键词】:二分,思维

转载于:https://www.cnblogs.com/little-w/p/3525273.html

UVALive2678子序列相关推荐

  1. UVALive2678:Subsequence

    UVALive2678:Subsequence 题目大意 给定一个数组A和一个整数S.求数组A中,连续且之和不小于S的连续子序列长度最小值. 要求复杂度:Ο(n) Solution 用变量L表示所选区 ...

  2. LeetCode简单题之最长和谐子序列

    题目 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 . 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度. 数组的子序列是一个由数组派生出来的 ...

  3. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  4. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

  5. 经典dp最长递增子序列

    经典dp最大递增子序列,  看了好长时间,看了好多版本.最终因为这个看懂,也觉得这个是最全面的吧,我感觉我好菜啊. http://wenku.baidu.com/view/bed07b15552707 ...

  6. leetcode-300 最长上升子序列

    题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度 ...

  7. leetcode-152 乘积最大子序列

    题目描述: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6 ...

  8. 无序数组及其子序列的相关问题研究

    算法中以数组为研究对象的问题是非常常见的. 除了排序大家经常会遇到之外, 数组的子序列问题也是其中的一大分类. 今天我就对自己经常遇到的无序数组的子序列相关问题在这里总结一下. 前置条件: 给定无序数 ...

  9. 最长公共上升子序列 LCIS

    关于子序列什么什么的问题,以前一直没怎么在意过,直到省赛突然考了一个赤裸裸的LCIS,这下才着急了,因为忘记怎么做了,而且模版也没有带.从第三名一直掉到第11名,而且超上来的,全都是会做这题的o(╯□ ...

最新文章

  1. 学完 CompletionService,可以做时间管理大师?
  2. Windows 10或成为最后一个Windows版本
  3. php访问数组用引号_php双引号中访问数组元素报错如何解决
  4. Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”
  5. 邮件列表统计(网站推广)
  6. 工程联盟管理平台、CRM、项目管理、合同管理、合作商管理、考勤管理、成本管理、指标管理、业主管理、工时报告、招投标、开票回单、物料库、培训中心、知识库、采购管理、Axure原型、产品原型、rp原型
  7. LeetCode(897)——递增顺序查找树(JavaScript)
  8. LeetCode 101 对称二叉树的几种思路(Python实现)
  9. C++中L和_T()之区别
  10. python 导入数据集并画图_python matplotlib画图教程学习:(三)IRIS数据集作图
  11. 海外抖音推荐算法,玩转tiktok短视频内容运营
  12. 服务器自检后显示scsi,“服务器百问百答”服务器怎样格式化SCSI硬盘?
  13. antd源码-spin解析
  14. 新手怎么开通抖音小店?详细操作步骤分享,建议收藏
  15. 游戏评论之——戴森球计划
  16. 合并两个或者多个select结果集
  17. 灰色模型(GM)的局限浅谈
  18. 基于K均值算法的鸢尾花聚类实验(Sklearn实现)
  19. 公链应用争夺战:未来区块链生态真的“根特多,叶子少”?
  20. c语言学生成绩统计表人数比例,计算机等级考试成绩分析(2010-2013).doc

热门文章

  1. 一觉醒来,借呗竟然被封了
  2. Deep Belief Networks
  3. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  4. 服务器apache远程命令,Linux实例:用socket通讯远程执行命令
  5. 服务器信息化平台,管理系统的信息化平台.ppt
  6. c语言最简单程序实例,C语言第一个简单实例
  7. 换脸系列——眼鼻口替换
  8. 损失函数梯度对比-均方差和交叉熵
  9. Matlab计算机视觉/图像处理工具箱(待续)
  10. python第五次作业——陈灵院