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 。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 1e5+; struct node
{
int val, pos;
};
node a[MAXN], dp[MAXN]; bool ok(node x, node y)
{
return (x.val-y.val)>=(x.pos-y.pos);
} int Search(node dp[], int n, node x)
{
int l = , r = n;
while(l<=r)
{
int mid = (l+r)>>;
if(ok(x,dp[mid]))
l = mid + ;
else
r = mid - ;
}
return r;
} int main()
{
int n, m;
while(scanf("%d", &n)!=EOF)
{
for(int i = ; i<=n; i++)
scanf("%d",&a[i].val);
m = ;
for(int i = ; i<=n; i++)
if(a[i].val>=i)
a[++m].val = a[i].val, a[m].pos = i; int len = ;
for(int i = ; i<=m; i++)
{
if(i==||ok(a[i],dp[len]))
dp[++len] = a[i];
else
{
int pos = Search(dp,len,a[i]);
dp[pos+] = a[i];
}
}
printf("%d\n", n-len);
}
}
51Nod 1294 修改数组 —— LIS的更多相关文章
- 51nod 1294 修改数组
若a[i]-i(i从1开始)的值小于0,那么a[i]必须改变 若a[i]-i的值大于等于0,将a[i]-i存入新的数组中,求出新数组的最长非严格上升子序列,所得即最多的,不用改变的数. #includ ...
- 51nod 1294 :修改数组 && HDU 5256:序列变换
1294 修改数组 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 取消关注 给出一个整数数组A,你可以将任何一个数修 ...
- 51nod1294 修改数组
看题解的...就是将必须要修改的数去掉后求最长的不递减子序列. upper_bound+lower_bound要理解.有时候-1有时候不用是有原因的. #include<cstdio> # ...
- 51nod 修改数组
修改数组 给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数.问最少需要修改几个数? Input 第1行:一个数N表示序列的长度(1 <= N ...
- Java修改数组长度
java中没有关于修改数组长度的api,在此本人提供了修改数组长度的两个函数:arrayAddLength()和arrayReduceLength().详细见代码. [java] view plai ...
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- js递归遍历多维数组并在修改数组的key后返回新的多维数组
我司最近正在用VUE做一个基于用户权限显示不同左侧菜单的后台管理系统,接口会根据用户的权限不同返回不同的菜单名称.URL等,前端要将这些菜单名称及URL动态添加到系统的左侧,这里就用到了vue-rou ...
- 【Java】 剑指offer(2) 不修改数组找出重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少 ...
- PHP 中如何创建和修改数组?
PHP中使用array来创建一个数组:array( key=>value , key=>value …… )用方括号的语法来修改数组:$arr[] = value 例如:$arr = ar ...
随机推荐
- 清空catalina.out报错Permission denied
今天在清空catalina.out的时候报错 [yangkun@sg logs]$ sudo echo '' > catalina.out -bash: catalina.out: Permis ...
- Command terminated by signal 11
Command terminated by signal 11可能的情况之中的一个是数组越界.你在訪问不被同意的内存空间.
- TCP/IP详解 卷一(第四、五章 ARP、RARP)
数据链路如 以太网都有自己的寻址机制(MAC)地址,而IP层使用的是IP地址. 当一台主机把以太网数据发送定位于同一局域网上的另一台主机时,是根据MAC地址来确定目的接口的.设备驱动程序从不检查IP数 ...
- js:Razor视图下服务器代码给Javascript变量赋值
namespace Razor.Controllers { public class JSController : Controller { public ActionResult Index() { ...
- 动态PPT制作
今天开通的博客,希望以后能够和大家一起分享学习心得.今天也是第一次学习制作动态PPT. 如果想要做成flash那种效果,建议学习下<动画传奇>这本书. 做成flash效果,需要用到动画中的 ...
- 连续调用scanf的问题总结
对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1.多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scan ...
- python实现区块链代码
如果你明白了原理其实挺简单的. 加密算法是python自带的 需要导入hashlib import hashlib as hash sha = hasher.sha256() sha.update(' ...
- Mysql或者Hive数据行变成列
对于mysql / hive 再进行统计的时候假设须要行变成列,能够使用函数 CASE 字段a WHEN 值b THEN c [WHEN d THEN e]* [ELSE f] END 当字段a=值 ...
- 宜人贷PaaS数据服务平台Genie:技术架构及功能
上篇:架构及组件 一.数据平台的发展 1.1 背景介绍 随着数据时代的到来,数据量和数据复杂度的增加推动了数据工程领域的快速发展.为了满足各类数据获取/计算等需求,业内涌现出了诸多解决方案.但大部分方 ...
- Android中BaseAdapter使用基础点
Android中要填充一些控件(如ListView)经常须要用到Adapter来实现,经常使用的有ArrayAdapter,SimpleAdapter, CursorAdapter,BaseAdapt ...