题目大意:
给出一个数列 ,修改最少的数字,使得数列严格单调递增。
思路:
思路一:
DP
D
P
修改最少的数字,其实就是让最多的数字保留不变(即最多的数字严格递增),那么就是一道经典的
DP
D
P
,求出最长上升子序列后用
n
n
减即可。
思路二:二分
对于一个已有个数字的单调递增数列
a[1]...a[k]
a
[
1
]
.
.
.
a
[
k
]
,再新加入一个数字
x
x
,若,则加入这个数字后数列依然保持单调递增,但如果
x≤a[k]
x
≤
a
[
k
]
,那么就从
1
1
到二分(或者直接使用
lower
l
o
w
e
r
_
bound
b
o
u
n
d
),找到比
x
x
小且没有数字更接近的数字,将这个位置赋值为
x
x
。
最终答案是
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[100005],l,r,mid,i,k;
int main()
{
scanf("%d",&n);
for (int j=1;j<=n;j++)
{
scanf("%d",&k);
if (a[i]>=k) *lower_bound(a+1,a+1+i,k)=k; //与二分相同性质,要用algorithm库
else a[++i]=k;
}
printf("%d\n",n-i);
return 0;
}