【二分】洛谷_3902 递增

本文介绍了一种算法,用于找出最少需要修改哪些数字才能使一个整数序列变为严格递增序列。通过使用二分查找法优化插入位置,有效地减少了计算复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给出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);
}
### 关于洛谷 B3797 的题目解析与编程实现 目前提供的引用材料中并未直接提及洛谷 B3797 这道题目的具体信息[^1]。然而,可以通过分析洛谷平台上的其他题目及其分类来推测该题可能涉及的知识点和解法。 #### 可能的题目背景 根据洛谷平台上常见的题目分类方式,B系列通常属于基础练习题,而编号接近 B3637(最长上升子序列)的题目可能会涉及到动态规划或其他经典算法[^3]。因此,可以合理猜测洛谷 B3797 是一道关于 **数组操作** 或者 **字符串处理** 类型的基础或中级难度题目。 #### 解决方案框架 如果假设此题为典型的数组或字符串问题,则解决方案可以从以下几个方面入手: 1. **输入输出理解**: 明确题目中的输入格式以及期望得到的结果形式。 2. **核心逻辑设计**: 基于题目需求构建相应的计算模型或者遍历策略。 3. **边界条件考虑**: 对极端情况下的行为进行定义,比如空数组、单元素等情况。 4. **优化空间复杂度**: 如果存在多次查询的需求,尝试预处理减少重复运算的时间消耗。 下面给出一段通用性的伪代码作为参考模板: ```python def solve_problem(input_data): result = [] # 初始化必要的参数 n = len(input_data) dp_table = [0]*n # 主循环体执行特定业务逻辑 for i in range(n): max_val = 0 for j in range(i): if condition_met(input_data[j], input_data[i]): max_val = max(max_val, dp_table[j]) dp_table[i] = max_val + transformation_function(input_data[i]) final_answer = compute_final_result(dp_table) return final_answer ``` 上述代码片段展示了如何通过双重嵌套循环解决问题,并利用`dp_table`存储中间状态以便后续使用。 #### 示例程序 (假定目标是最长递增子列) 考虑到之前提到过的相似案例——即求解最长递增子序列(LIS),这里提供一个具体的Python实现版本供学习交流之用: ```python from bisect import bisect_left def length_of_LIS(nums): tails = [] for num in nums: pos = bisect_left(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails) # 测试数据集 test_cases = [ ([10,9,2,5,3,7,101,18], 4), ([0,1,0,3,2,3], 4), ([7,7,7,7,7,7,7], 1) ] for seq, expected_len in test_cases: actual_len = length_of_LIS(seq) print(f"For sequence {seq}, the Length of LIS is {actual_len} ({'Correct' if actual_len==expected_len else 'Incorrect'})") ``` 以上脚本采用二分查找方法加速寻找合适位置的过程,在保持较低时间复杂度的同时也兼顾了可读性和扩展性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值