题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294

1294 修改数组 
题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

 收藏
 关注

给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?
Input
第1行:一个数N表示序列的长度(1 <= N <= 100000)。
第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)
Output
输出最少需要修改几个数使得整个数组是严格递增的。
Input示例
5
1
2
2
3
4
Output示例
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相关推荐

  1. 51nod 修改数组

    修改数组 给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数.问最少需要修改几个数? Input 第1行:一个数N表示序列的长度(1 <= N ...

  2. C++ 笔记(08)— 数组(数组的声明、初始化、访问及修改数组元素)

    数组具有如下特点: 数组是一系列元素: 数组中所有元素的类型都相同: 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址对应最后一个元素. 1. 一维数组 1.1 声明数组 要声 ...

  3. 修改数组的值和多维数组排序

    foreach($ret as $key => $value) { //将数组元素中为空地补0,且添加sum元素的计算,注意修改数组的值,需要$key定位到是数组的哪一个地方需要修改,而不能简单 ...

  4. php foreach 修改数组,php如何使用foreach修改数组

    php foreach修改数组的方法:首先创建一个PHP示例文件:然后通过foreach语句"foreach($array as $k => $v){$v = 1;}"修改指 ...

  5. B10_NumPy数组操作、修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除

    NumPy数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resha ...

  6. B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)

    NumPy迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用arange()函数 ...

  7. jQuery修改数组$.map

    $.map() :用于修改数组 第一个参数是哪个对象 第二个参数是修改函数(会自己遍历所有的) $(function () { var arr = [ "a", "b&q ...

  8. PostgreSQL 多重含义数组检索与条件过滤 (标签1:属性, 标签n:属性) - 包括UPSERT操作如何修改数组、追加数组元素

    摘要: 标签 PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理 背景 PG的数组类型,被广泛应用于 画像系统 , 标签系统. 在一些业务重建中,对数组内容的定义往往包含了 ...

  9. python3-numpy 数组操作--修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除

    1.修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 ravel 返回展开数组 1.1 ...

最新文章

  1. BCH应无惧11月,奋力求发展
  2. 用tc(traffic control)控制网络流量
  3. Python操作excel文件创建workbook和批量创建Sheet
  4. [Leedcode][JAVA]第[945]题
  5. tcp建立连接为什么需要三次握手
  6. python tkinter布局混用_python tkinter布局界面如何实现?
  7. Linux驱动下的platform总线架构(转)
  8. 使用vue-qriously插件,在vue项目中生成二维码
  9. 【优化求解】基于matlab免疫算法求解函数极值问题【含Matlab源码 1200期】
  10. Linux实操篇②(远程连接Linux;Xshell 6 和 Xftp 6 工具的安装;Xshell 6 和 Xftp 6 工具的配置和使用;)
  11. 2.2中文分词和新词识别
  12. php有个schost.exe_svchost.exe是什么
  13. hr标签---中心线:设置颜色
  14. Java生成临时文件
  15. Python-OpenCV 图像加权混合(滤色, 叠加, 柔光, 强光)
  16. Twilio Inc.(TWLO)2020年第三季度收益电话会议记录
  17. windows系统在路由器组成的局域网中共享打印机
  18. MMC5603NJ地磁传感器(指南针示例)
  19. coreldraw怎么画猴子_小猴头像简笔画【CDR11设计制作逼真的小猴头像实例教程】...
  20. putty 遂道_为什么将网络隧道称为“隧道”?

热门文章

  1. PHP GD库生成图像的几个函数总结
  2. Spring整合Hibernate图文步骤
  3. JavaScript(19)jQuery HTML 获取和设置内容和属性
  4. MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
  5. 自顶向下 与自底向上解决01 背包问题
  6. mysql创建表对经常要查询的列添加索引或者组合索引
  7. 虚函数表 vtable
  8. Makefile_06:如果引用其它的 Makefile
  9. 在下列选项中,没有构成死循环的程序的是?
  10. C语言以下4个选项中,不能看作一条语句的是?