51Nod 1294 修改数组 —— LIS
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294
第1行:一个数N表示序列的长度(1 <= N <= 100000)。 第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)
输出最少需要修改几个数使得整个数组是严格递增的。
5 1 2 2 3 4
3
题意:
给出一个数列,问至少修改多少个数,使得序列:全为正整数且严格单调递增。
题解:
1.首先,不需要修改的数构成了这个数列的“骨架”,这个“骨架”且满足:b[i].val-b[j].val>=b[i].index-b[j].index, i>j,这条不等式限制了在骨架点i和j之间,必须有足够范围的数。
2.可知第一个数最小为1,第二个数最小为2,……第i个数最小为i。
3.根据第2点,可以得出一个结论:当a[i]<i时,a[i]必须修改;当a[i]>=i时,a[i]可能不需要修改。
4.所以将可能不需要修改的数(包括数值和其所在的位置)提取出来,放到结构体数组b[]当中,然后求b[]数组的LIS(需满足:b[i].val-b[j].val>=b[i].index-b[j].index, i>j),即为整个序列的“骨架”,在“骨架上”的数都不需要修改,所以:ans = n - LIS_LEN 。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <cmath> 7 #include <queue> 8 #include <stack> 9 #include <map> 10 #include <string> 11 #include <set> 12 using namespace std; 13 typedef long long LL; 14 const int INF = 2e9; 15 const LL LNF = 9e18; 16 const int MOD = 1e9+7; 17 const int MAXN = 1e5+10; 18 19 struct node 20 { 21 int val, pos; 22 }; 23 node a[MAXN], dp[MAXN]; 24 25 bool ok(node x, node y) 26 { 27 return (x.val-y.val)>=(x.pos-y.pos); 28 } 29 30 int Search(node dp[], int n, node x) 31 { 32 int l = 1, r = n; 33 while(l<=r) 34 { 35 int mid = (l+r)>>1; 36 if(ok(x,dp[mid])) 37 l = mid + 1; 38 else 39 r = mid - 1; 40 } 41 return r; 42 } 43 44 int main() 45 { 46 int n, m; 47 while(scanf("%d", &n)!=EOF) 48 { 49 for(int i = 1; i<=n; i++) 50 scanf("%d",&a[i].val); 51 m = 0; 52 for(int i = 1; i<=n; i++) 53 if(a[i].val>=i) 54 a[++m].val = a[i].val, a[m].pos = i; 55 56 int len = 0; 57 for(int i = 1; i<=m; i++) 58 { 59 if(i==1||ok(a[i],dp[len])) 60 dp[++len] = a[i]; 61 else 62 { 63 int pos = Search(dp,len,a[i]); 64 dp[pos+1] = a[i]; 65 } 66 } 67 printf("%d\n", n-len); 68 } 69 }
View Code
转载于:https://www.cnblogs.com/DOLFAMINGO/p/8708500.html
51Nod 1294 修改数组 —— LIS相关推荐
- 51nod 修改数组
修改数组 给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数.问最少需要修改几个数? Input 第1行:一个数N表示序列的长度(1 <= N ...
- C++ 笔记(08)— 数组(数组的声明、初始化、访问及修改数组元素)
数组具有如下特点: 数组是一系列元素: 数组中所有元素的类型都相同: 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址对应最后一个元素. 1. 一维数组 1.1 声明数组 要声 ...
- 修改数组的值和多维数组排序
foreach($ret as $key => $value) { //将数组元素中为空地补0,且添加sum元素的计算,注意修改数组的值,需要$key定位到是数组的哪一个地方需要修改,而不能简单 ...
- php foreach 修改数组,php如何使用foreach修改数组
php foreach修改数组的方法:首先创建一个PHP示例文件:然后通过foreach语句"foreach($array as $k => $v){$v = 1;}"修改指 ...
- B10_NumPy数组操作、修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除
NumPy数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resha ...
- B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)
NumPy迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用arange()函数 ...
- jQuery修改数组$.map
$.map() :用于修改数组 第一个参数是哪个对象 第二个参数是修改函数(会自己遍历所有的) $(function () { var arr = [ "a", "b&q ...
- PostgreSQL 多重含义数组检索与条件过滤 (标签1:属性, 标签n:属性) - 包括UPSERT操作如何修改数组、追加数组元素
摘要: 标签 PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理 背景 PG的数组类型,被广泛应用于 画像系统 , 标签系统. 在一些业务重建中,对数组内容的定义往往包含了 ...
- python3-numpy 数组操作--修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除
1.修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 ravel 返回展开数组 1.1 ...
最新文章
- BCH应无惧11月,奋力求发展
- 用tc(traffic control)控制网络流量
- Python操作excel文件创建workbook和批量创建Sheet
- [Leedcode][JAVA]第[945]题
- tcp建立连接为什么需要三次握手
- python tkinter布局混用_python tkinter布局界面如何实现?
- Linux驱动下的platform总线架构(转)
- 使用vue-qriously插件,在vue项目中生成二维码
- 【优化求解】基于matlab免疫算法求解函数极值问题【含Matlab源码 1200期】
- Linux实操篇②(远程连接Linux;Xshell 6 和 Xftp 6 工具的安装;Xshell 6 和 Xftp 6 工具的配置和使用;)
- 2.2中文分词和新词识别
- php有个schost.exe_svchost.exe是什么
- hr标签---中心线:设置颜色
- Java生成临时文件
- Python-OpenCV 图像加权混合(滤色, 叠加, 柔光, 强光)
- Twilio Inc.(TWLO)2020年第三季度收益电话会议记录
- windows系统在路由器组成的局域网中共享打印机
- MMC5603NJ地磁传感器(指南针示例)
- coreldraw怎么画猴子_小猴头像简笔画【CDR11设计制作逼真的小猴头像实例教程】...
- putty 遂道_为什么将网络隧道称为“隧道”?