zoukankan      html  css  js  c++  java
  • [GRYZ2015]INCR

    题目描述

    数列 A1,A2,...,AN,修改最少的数字,使得数列严格单调递增。

    输入格式

    第 1 行,1 个整数 N

    第 2 行,N 个整数 A1,A2,...,AN

    输出格式

    1 个整数,表示最少修改的数字

    样例输入

    3

    1 3 2

    样例输出

    1

    数据范围

    对于 50% 的数据,N ≤ 10^3

    对于 100% 的数据,1 ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^9

    思路

      需要用O(NlogN)的最长上升子序列。需要改几个小地方。

      有一个注意问题,就是改的数能不能是实数,我本来没有考虑这个情况,写了一个本来错误的程序,不过后来居然奇迹的卡过了所有点。(⊙o⊙)

     

    机房断电了,代码没了,就这样吧。

    STD:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    const int maxn=100005;
    const int oo=0x3fffffff;//极大值
    int a[maxn];
    int lis[maxn], pos[maxn];
    
    int main()
    {
        int n;
        while(cin >> n)
        {
            for(int i=1; i<=n; i++) scanf("%d",a+i);
            int top=0;
            lis[0]=-oo;
            for(int i=1; i<=n; i++)
            {
                if(a[i]>lis[top]&&a[i]-lis[top]-1>=i-pos[top]-1)
                {
                    lis[++top]=a[i];
                    pos[top]=i;
                }
                else
                {
                    int l=0, r=top, tp=-1;
                    while(l<=r)
                    {
                        int mid=(l+r)>>1;
                        if(a[i]-lis[mid]-1>=i-pos[mid]-1)
                        {
                            tp=mid;
                            l=mid+1;
                        }
                        else r=mid-1;
                    }
                    if(tp!=-1) lis[tp+1]=a[i], pos[tp+1]=i;
                }
            }
            cout << n-top <<endl;
        }
        return 0;
    }
  • 相关阅读:
    安全实践鬼手诀 杂志
    Android 应用资源随笔
    Android 构架
    Andorid杂笔 深入理解Activity,Intenthe IntentFilter
    Android杂笔 事件处理
    创建9-Patch自定义伸缩图片
    重拾C之语句,操作符和表达式
    CSS float属性
    最近最少使用队列算法
    java常见面试题
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4936083.html
Copyright © 2011-2022 走看看