2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II
思路
此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多。
大体解题过程与上一题相同。区别在于对\(f[]\) 的操作。没有长度限制的时候,\(f[]\) 的更新策略是立即更新。假设间隔为\(T\),现在由于需要考虑间隔,那么在处理第\(i\) 个元素的时候,就需要看到 前\(i -T\) 个元素生成的\(f[]\) ,而不能受到第\(i-T+1\) 到 \(i-1\) 个元素的干扰。因此,考虑如下操作:每次准备更新\(f[]\) 时,先不要更新,记录下操作的内容,过\(T\) 步再进行操作,这样就可以让\(f[]\) 不再显示当前元素之前\(T\) 步的修改内容,每次更新都不受前\(T\) 步的影响,因此生成的序列中相邻元素的间隔都是不小于\(T\) 的。
代码
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 500010;
int nums[MAXN], pool[MAXN];
queue<pair<int, int>> buffer;
//用二分查找的方法找到一个位置,使得num>pool[i-1] 并且num<pool[i],并用num代替b[i]
int Search(int num, int low, int high) {
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (num > pool[mid]) low = mid + 1;
else high = mid - 1;
}
return low;
}
int DP(int n, int k) {
while (!buffer.empty())buffer.pop();
int i, len, pos;
pool[1] = INT_MAX;
len = 1;
for (i = 1; i <= n; i++) {
if (nums[i] > pool[len]) { //如果a[i]比b[]数组中最大还大直接插入到后面即可
buffer.emplace(nums[i], len + 1);
} else { //用二分的方法在b[]数组中找出第一个比a[i]大的位置并且让a[i]替代这个位置
pos = Search(nums[i], 1, len);
buffer.emplace(nums[i], pos);
}
while (buffer.size() >= k) {
if (buffer.front().second > len) {
len = buffer.front().second;
pool[buffer.front().second] = buffer.front().first;
} else if (buffer.front().first < pool[buffer.front().second]) {
pool[buffer.front().second] = buffer.front().first;
}
buffer.pop();
}
}
while (!buffer.empty()) {
if (buffer.front().second > len) {
len = buffer.front().second;
pool[buffer.front().second] = buffer.front().first;
} else if (buffer.front().first < pool[buffer.front().second]) {
pool[buffer.front().second] = buffer.front().first;
}
buffer.pop();
}
return len;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> nums[i];
cout << DP(n, k) << "\n";
}
2016级算法第四次上机-G.ModricWang的序列问题 II的更多相关文章
- 2016级算法第四次上机-B ModricWang的序列问题
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...
- 2016级算法第六次上机-G.ModricWang likes geometry
1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码
- 2016级算法第五次上机-G.ModricWang的撒币游戏
1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
- 2016级算法第四次上机-F.AlvinZH的最“长”公共子序列
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] ...
- 2016级算法第四次上机-D.AlvinZH的1021实验plus
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...
- 2016级算法第三次上机-G.Winter is coming
904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划. ...
- 2016级算法第四次上机-C.AlvinZH的1021实验
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...
- 2016级算法第四次上机-A.Bamboo 和人工zz
Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pq ...
随机推荐
- socket,TCP/IP的理解(转)
TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间 ...
- 基于Mybatis分页插件PageHelper
基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...
- 第一个Django应用程序_part3
一.概述 此文延续第一个Django应用程序part2. 官方文档:https://docs.djangoproject.com/en/1.11/intro/tutorial03/ view是Djan ...
- javascript对变量和函数的声明提前‘hoist’
hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 原文地址:http://www.bootcss.com/article/variab ...
- linux zip解压缩中文乱码
这里提供两个解决方案: 1.python处理下:https://gist.github.com/wangjiezhe/7841a350983a147b6d7e 2.java的zip4j:http:// ...
- java 将一个数组中的值按逆序重新存放,例如,原来顺序为:9,5,7,4,8,要求改为:8,4,7, 5,9。
public class Test3 { public static void main(String[] args) { int[] grade = {87,88,89,98,78}; int m; ...
- jstack调试core文件
摘自:https://stackoverflow.com/questions/37331266/jstack-throws-exception-interrogating-a-core // 错误示例 ...
- 白盒测试实践--Day0
白盒测试实践--Day0 累计完成任务情况: 阶段内容 参与人 开会学习作业要求,取得共识 全体 注: 1."阶段内容"划斜线表示完成. 2.采用倒序. 具体情况: 组长提前组织分 ...
- .NET开源MSSQL、Redis监控产品Opserver之Exception配置
异常日志的记录和监控主要依赖于StackExchange.Exceptional组件,默认已经被引进来了. 先看下config文件夹下的ExceptionsSettings.json.example文 ...
- OpenCV源码解析
OpenCV K-means源码解析 OpenCV 图片读取源码解析 OpenCV 视频播放源码解析 OpenCV 追踪算法源码解析 OpenCV SIFT算法源码解析 OpenCV 滤波源码分析:b ...