【9018p1407】拦截导弹(二分)

本文介绍了一种求解最长递增子序列(LIS)问题的高效算法实现。通过使用二分查找法来优化传统方法,该算法能够在O(n log n)的时间复杂度内找到给定序列中最长递增子序列的长度。

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

#include<iostream> 
using namespace std; 
#include<cstdio> 
int i,j,n,a[100001],b[100001],m,ans=0,left,k; 
int find(int r,int x) 
{ 
    int m,left=0; 
    while(left<=r) 
    { 
        m=(left+r)/2; 
        if(x>b[m])left=m+1; 
        else if(x<b[m])r=m-1; 
        else {k=left;return m;} 
    } 
    k=left; 
    return left; 
} 
int main() 
{ 
    scanf("%d",&n); 
    for(i=n;i>0;i--)scanf("%d",&a[i]); 
    for(i=1;i<=n;i++) 
    { 
        j=1;k=ans; 
        while(j<=k){   
                m=(j+k)/2;   
                if(b[m]<=a[i])j=m+1;   
                else k=m-1;   
            }  
        if(j>ans)ans++; 
        b[j]=a[i]; 
    }  
    printf("%d",ans); 
    return 0; 
} 

P3903 导弹拦截III是一道经典的算法题目,通常出现在编程竞赛或算法练习中。该题目主要涉及动态规划或贪心算法,具体描述如下: **题目描述:** 给定一组导弹的高度序列,要求计算最少需要多少个拦截系统来拦截所有导弹。每个拦截系统可以拦截一段连续的高度序列,且每个系统只能拦截一次。 **解题思路:** 1. **动态规划**:使用动态规划的思想,维护一个数组`dp`,其中`dp[i]`表示拦截前`i`个导弹所需的最少拦截系统数。对于每个导弹,遍历之前的系统,找到一个可以拦截该导弹的系统进行更新,或者增加一个新的系统。 2. **贪心算法**:使用贪心算法,维护一个数组`ends`,其中`ends[i]`表示第`i`个拦截系统的拦截范围的末尾。对于每个导弹,尝试将其加入到现有的拦截系统中,如果不能加入,则增加一个新的系统。 **示例代码(动态规划):** ```python def missile_interception(heights): n = len(heights) dp = [1] * n for i in range(n): for j in range(i): if heights[j] >= heights[i]: dp[i] = max(dp[i], dp[j] + 1) return max(dp) # 示例 heights = [3, 2, 1, 4, 5] print(missile_interception(heights)) # 输出:2 ``` **示例代码(贪心算法):** ```python def missile_interception_greedy(heights): ends = [] for height in heights: left, right = 0, len(ends) while left < right: mid = (left + right) // 2 if ends[mid] >= height: right = mid else: left = mid + 1 if left == len(ends): ends.append(height) else: ends[left] = height return len(ends) # 示例 heights = [3, 2, 1, 4, 5] print(missile_interception_greedy(heights)) # 输出:2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值