https://www.luogu.org/problemnew/show/P1439
题目描述
现有数列A1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增。
输入输出格式
输入格式:
第1 行,1 个整数N
第2 行,N 个整数A1,A2,⋯,AN
输出格式:
1 个整数,表示最少修改的数字
输入输出样例
输入样例#1: 复制
3
1 3 2
输出样例#1: 复制
1
说明
• 对于50% 的数据,N≤103
• 对于100% 的数据,1≤N≤105,1≤Ai≤109
解题思路:
把序列变成递增的,可以先求出最长上升子序列,然后改变那些除了最长上升子序列的数,所以答案就是
总数-最长上升子序列数。
#include <stdio.h>
#include <algorithm>
using namespace std;
#define N 100020
int a[N], f[N];
int main()
{
int n, i, len, l, r, mid, inf=199999999;
while(scanf("%d", &n)!=EOF)
{
for(i=1; i<=n; i++)
scanf("%d", &a[i]);
f[1]=a[1];
len=1;
for(i=2; i<=n; i++)
{
l=1;r=len;
while(l<=r)
{
mid=(l+r)/2;
if(f[mid]>=a[i])
r=mid-1;
else
l=mid+1;
}
f[l]=a[i];
len=max(len, l);
}
printf("%d
", n-len);
}
return 0;
}