递增
题目
- 现有数列A1,A2,····,AN,修改最少的数字,使得数列严格单调递增。
输入
-
第1 行,1 个整数N
-
第2 行,N 个整数A1,A2,⋯,AN
输出
- 1 个整数,表示最少修改的数字
输入样例
3
1 3 2
输出样例
1
说明
-
对于50% 的数据,N≤10^3
-
对于100% 的数据,1≤N≤10 ^ 5 ,1≤Ai≤10 ^ 9
解题思路
- 其实这道题就是一道二分,把每一个数放入一个数组中,看是否比上一个大,如果大就加到后面,不然就从第一个开始看,找比它大的就换掉.这样就可以得出最长上升序列,然后就可以把n减去即可.
程序如下
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[1000001],b[1000001],r,l,s,mid,sum;
int main()
{
scanf("%d",&n);
scanf("%d",&a[1]);
b[1]=a[1];//把第一个存进数组
sum=1;
for(int i=2;i<=n;++i)
{
scanf("%d",&s);
if(s>b[sum])//如果比第一个数大就加在后面一个
{
sum++;
b[sum]=s;//加进去
}
else//如果比其中的第一个数小就替换
{
l=1;
r=sum;
while(l<=r)
{
mid=(l+r)>>1;//二分
if(b[mid]>s) r=mid-1;
else l=mid+1;
}
b[r+1]=s;//替换
}
}
printf("%d",n-sum);
return 0;
}
该博客介绍了一种利用二分查找策略解决如何修改最少数字使数列严格单调递增的问题。通过创建新数组并判断每个元素是否大于前一个元素,找到合适位置进行替换,从而求得最长上升子序列,最终计算需要修改的数字数量。适用数据范围为1≤N≤10^5,1≤Ai≤10^9。
695

被折叠的 条评论
为什么被折叠?



