递增【二分】

题目大意:

给出一个数列 ,修改最少的数字,使得数列严格单调递增。


思路:

思路一: DP D P
修改最少的数字,其实就是让最多的数字保留不变(即最多的数字严格递增),那么就是一道经典的 DP D P ,求出最长上升子序列后用 n n 减即可。


思路二:二分
对于一个已有k个数字的单调递增数列 a[1]...a[k] a [ 1 ] . . . a [ k ] ,再新加入一个数字 x x ,若x>a[k],则加入这个数字后数列依然保持单调递增,但如果 xa[k] x ≤ a [ k ] ,那么就从 1 1 k二分(或者直接使用 lower l o w e r _ bound b o u n d ),找到比 x x 小且没有数字更接近x的数字,将这个位置赋值为 x x
最终答案是ni


代码:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值