序列变换我们需要的是一个修改以后的最长递增子序列
因为修改的数只能是整数
所以我们的还要考虑数是否可以修改
我们对所有输入的数减去i也就是他们的位置
这样我们就只需要求最长非递减子序列即可
n的时间复杂度太罗嗦了
我们log(n)的还好说。。、
正常的最长递增子序列是利用stl 函数的lower_bound
这里我们要的是非递减子序列
用upper_bound即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int a[100003];
int b[100003];
int solve(int n)
{
int s=0;
b[++s]=a[0];
for(int i=1;i<n;i++)
{
if(a[i]>=b[s])
b[++s]=a[i];
else
{
int z=upper_bound(b+1,b+s,a[i])-b;
b[z]=a[i];
}
}
return s;
}
int main()
{
int T;
scanf("%d",&T);
int time=0;
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
a[i]-=i;
}
int ans=n-solve(n);
printf("Case #%d:\n",++time);
printf("%d\n",ans);
}
}
如果还想看类似的题可以点开