标签:lis name http coder 枚举 else https pac ace
题目链接: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",n-ans);
return 0;
}
标签:lis name http coder 枚举 else https pac ace
原文地址:https://www.cnblogs.com/1024-xzx/p/13378417.html