zoukankan      html  css  js  c++  java
  • 递增【二分】

    题目大意:

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


    思路:

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


    思路二:二分
    对于一个已有k个数字的单调递增数列a[1]...a[k],再新加入一个数字x,若x>a[k],则加入这个数字后数列依然保持单调递增,但如果xa[k],那么就从1k二分(或者直接使用lower_bound),找到比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;
    }
  • 相关阅读:
    学习进度三
    开课博客之个人介绍
    个人作业--数组
    学习进度二
    开学第一次测试
    实现点击不同的按钮加载不同的css
    Web存储
    HTML5(常用的表单控件)
    JS(获得当前时间并且用2015-01-01格式表示)
    JS(event事件)
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998768.html
Copyright © 2011-2022 走看看