【二分】洛谷_3902 递增

题意

给出n个数,求出修改最少的数字,使得数列严格单调递增。

思路

我们用一个数组s来记录当前存到的数字,每次放进一个数字,我们就判断它是不是比之前的数小,否则我们就二分找到一个最好的位置可以放下它。

代码

#include<cstdio>
int n,s[100001],a,tot,ans;
inline int ef(int x)
{
    int l=1,r=tot,mid;
    while(l<r)
    {
        mid=(l+r)>>1;
        if (s[mid]>=x) r=mid;
        else l=mid+1;
    }
    return l;
}
int main()
{
    scanf("%d",&n);
    scanf("%d",&a);
    s[++tot]=a;
    for (int i=1;i<n;i++)
    {
        scanf("%d",&a);
        if (a<s[tot]) {s[ef(a)]=a; ans++;}//二分位置直接替换,统计次数
        else s[++tot]=a;//否则直接放到后面
    }
    printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/SSL_hzb/article/details/81635571
今日推荐