P3902 递增
题目描述
现有数列 A,修改最少的数字,使得数列严格单调递增。
输入输出格式
输入格式:
第1 行,1 个整数N
第2 行,N 个整数
输出格式:
1 个整数,表示最少修改的数字
输入输出样例
输入样例#1:
3
1 3 2
输出样例#1:
1
1<=n<=100000
分析:求最长上升子序列长度len,n-len即为答案。
代码
#include <cstdio>
#define N 100005
using namespace std;
int n,a[N],f[N],ans;
int find(int l, int r, int x)
{
int p = 0;
while (l < r)
{
int mid = (l + r) / 2;
if (x > f[mid])
{
l = mid + 1;
p = mid;
}
else r = mid;
}
if (!p) p = l;else p++;
return p;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
f[1] = a[1];
ans=1;
for (int i = 2; i <= n; i++)
{
if (a[i] > f[ans])
{
f[++ans] = a[i];
continue;
}
int j = find(1,ans+1,a[i]);
f[j] = a[i];
}
printf("%d", n - ans);
}