Drop Voicing【LIS】

题目链接:https://ac.nowcoder.com/acm/contest/5670/D

分析:

将整个数组放在一个圆上去看,可以发现,(Invert) 操作只相当于把圆旋转了一个单位,而数字之间的相对位置并没有发生变化,并不会有影响排序的进行。因此要想排序,只有依靠 (Drop-2) 操作。对于该操作,相当于把当前的数移动到圆环上按顺时针的第二位置,即改变了相邻俩个数的相对位置。最少的移动次数就是最少的不在有序列中的数的个数,可以通过枚举序列的起点来求 (LIS)。其它的通过旋转来调整即可。

代码:

#include <bits/stdc++.h>

using namespace std;
const int N=510;
int a[N],d[N];
int main()
{
    int n,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        int cnt=1,p=1;
        d[p]=a[i];
        while(++cnt<=n)
        {
            int t=i+cnt-1;
            if(t>n) t%=n;
            if(d[p]<=a[t]) d[++p]=a[t];
            else
            {
                int x=lower_bound(d+1,d+1+p,a[t])-d;
                d[x]=a[t];
            }
        }
        ans=max(ans,p);
    }
    printf("%d
",n-ans);
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/13378417.html