挑战程序设计竞赛: Subsequence
文章目录
- 题目大意
- 解题思路
- 代码
- 知识点
题目大意
解题思路
- 技巧:
首先明确这里求的是连续子序列的和, 为了降低求和的复杂度,我们使用sum[i]sum[i]sum[i]表示前iii个数字的和。这样,iii到jjj的子序列和即为s[j]−s[i−1]s[j]-s[i-1]s[j]−s[i−1], 基于此,我们有三种方法进行求解。 - 解法:
一、暴力思路:按长度从小到大枚举。复杂度为O(n2)O(n^2)O(n2)会超时。
二、二分法: 对长度二分进行枚举。复杂度为O(nlogn)O(nlogn)O(nlogn).
三、尺寸法: 很明显此题满足尺寸法的情况.因此由如下步骤- (1): 初始sum=0,s=0,e=−1sum = 0, s = 0, e=-1sum=0,s=0,e=−1(sum的和始终为a[s]+a[s+1]+...+a[e]a[s]+a[s+1]+...+a[e]a[s]+a[s+1]+...+a[e])
- (2): 若sum < S 并且 e < N-1, 末端推进( sum+=a[++e])
- (3): 若sum >= S, 前端推进(sum-=a[s++])
- (4): 结束条件,末端到达最后,并且当前sum<S. 再无可行解
- (5): 推进过程更新最小满足区间长度, 直到结束条件.
- (6): 最后输出最小区间长度
代码
- 暴力法:略
- 二分法:
#include<iostream>
#include<stdio.h>
using namespace std;int main()
{int T;scanf("%d", &T);int sum[100000+5];int tmp;while(T--){int N, S;scanf("%d%d", &N, &S);sum[0] = 0;for(int i=1; i<=N; i++){scanf("%d", &tmp);sum[i] = sum[i-1]+tmp;}int ans = 10000000;int l = 1; int r = N;while(l < r){int mid = (l + r) / 2;int flag = 0;for(int i=1; i+mid-1<=N; i++){int j = i+mid-1;if(sum[j]-sum[i-1] >= S){ans = min(ans, mid);flag = 1;break;}}if(flag)r = mid;elsel = mid+1;}if(ans == 10000000)printf("0\n");elseprintf("%d\n", ans);}return 0;
}
- 尺寸法
#include<iostream>
using namespace std;
const int MAX = 100000+5;
int main()
{int T;cin >> T;int a[MAX];while(T--){int N, S;cin >> N >> S;for(int i=0; i<N; i++)cin >> a[i];int sum, s, e;sum = s = 0;e = -1;int ans = MAX;while(!(e == N-1 && sum < S)){if(sum < S && e < N-1)sum += a[++e];if(sum >= S){ans = min(ans, e-s+1);sum -= a[s++];}}if(ans == MAX)cout << 0 << endl;elsecout << ans << endl;}return 0;
}
知识点
尺寸法:
- 定义: 反复推进区间的开头和末尾,来求满足条件的最小区间的方法被称为尺寸法。
- 使用情况: 如果从起始点sss开始,区间[s,t][s,t][s,t]刚好满足题意,那么从起始点s+1s+1s+1开始,若区间[s+1,t′][s+1, t'][s+1,t′]满足题意,则t′>=tt' >= tt′>=t.
问:若含有负数,能否使用尺寸法?不行!!!
挑战程序设计竞赛: Subsequence相关推荐
- ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)
白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 1150 The Last Non-zero Digit超大组合数:求超大组合数P(n, m)的最后一个非零位.4.1更加复杂 ...
- POJ 3735 Training little cats 题解 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...
- POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3608 Bridge Across Islands跨岛大桥:在两个凸包小岛之间造桥,求最小距离?3.6与平面和空间打交道的计 ...
- 挑战程序设计竞赛(第2版)》
<挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...
- AOJ 1312 Where's Wally 题解《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> 本文由码农场 同步,最新版本请查看原文:http://www.hankcs.com/program/algorithm/aoj-131 ...
- 挑战程序设计竞赛——详解DFS及BFS
挑战程序设计竞赛--详解DFS及BFS 一.学会要用到的stl函数,Stack.Quene.Pair 1.Stack(DFS隐式的用到,并与Queue对比记忆) 头文件==#include== sta ...
- 【操作指导 | 代码实现】挑战程序设计竞赛2:算法和数据结构
书籍封面 第一章 前言 1. 本人衷心建议 ~~~~~~ 如果你是一位初学者,我指的是你只会基本的 C/C++ 编程,即使编的很烂,这本书对于你算法和数据结构的提升非常有帮助,所涉及的每一 ...
最新文章
- python数据分析设置_Python 数据分析系列之如何安装和设置 Python
- 信息工程大学806自主命题2020年回忆版真题2020年信息工程大学,初试806回忆版
- maven scala plugin 实现jvmArgs,执行过程原理解析笔记
- Mysql 查看、创建、更改 数据库和表
- 使用sqlldr导入文本数据到oracle
- python解压打开文件过多_让Python在后台自动解压各种压缩文件!
- CPython 标准库源码分析 collections.Counter
- Repository HDU - 2846 (trie)
- 拦截游戏窗口被移动_家中最值得购入的17款儿童游戏,教你如何从IPAD中夺回小朋友的注意力...
- Microsoft edge兼容性问题
- vue上传音视频文件并获取时长
- 华为手机录制屏幕视频的详细操作
- 分析企业上云的办法及意义
- 谐振电路及品质因数(三)
- Python的安装与运行
- 使用计算机软件进行电视剪辑称为,后期剪辑(影视后期制作一个流程)_百度百科...
- android 百度地图 车辆监控,实现GPS一辆或多辆小车在百度地图上显示驾驶路线
- 如何实施集团企业的ERP财务模块
- 锁相环 CD4046 的应用
- 云计算行业的前景如何?
热门文章
- Linux:关于设置PS1提示符输入长命令格式出现的问题及解决
- python项目实战:控制Windows电脑桌面壁纸
- java 正序a~z_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...
- 理论上 Android可以处理 多个手指的触摸
- Task一个轻量级分布式任务计算系统
- 金沙艺廊于澳门四季名荟正式开幕;招商维京游轮深耕“文游”助力中国旅游业高质量发展 | 全球旅报...
- FFS(快速文件系统)–Unix文件系统
- Uni-App - 使用 iconfont 图标或者自定义图标
- Live800:教育行业新拐点,在线客服系统如何提供价值?
- java hypot_Java StrictMath hypot()用法及代码示例