爱吃橘子的猴 2023-01-17 11:53 采纳率: 100%
浏览 58
已结题

二分法与dp代码书写错误?感觉二分可能出问题

嗯,简单的说,第一问可以说是求最长递减序列
只看第一问就可以

[NOIP1999 普及组] 导弹拦截

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式

一行,若干个整数,中间由空格隔开。

输出格式

两行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

样例 #1

样例输入 #1

389 207 155 300 299 170 158 65

样例输出 #1

6
2

提示

对于前 $50%$ 数据(NOIP 原题数据),满足导弹的个数不超过 $10^4$ 个。该部分数据总分共 $100$ 分。可使用$\mathcal O(n^2)$ 做法通过。
对于后 $50%$ 的数据,满足导弹的个数不超过 $10^5$ 个。该部分数据总分也为 $100$ 分。请使用 $\mathcal O(n\log n)$ 做法通过。

对于全部数据,满足导弹的高度为正整数,且不超过 $5\times 10^4$。

此外本题开启 spj,每点两问,按问给分。


$\text{upd 2022.8.24}$:新增加一组 Hack 数据。


#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int a[100005]={0};
int b[100005]={0};
int ans[2]={0};
int main(){
    int len=0;
    int n=0;
    while(scanf("%d",&a[n])!=EOF){
        n++;
    }
    for(int i=0;i<n-1;i++){
        if(a[i]<=b[len])b[++len]=a[i];
        if(a[i]>b[len]){
            int mid;
            int l=0;
            int r=len;
            int as=0;
            while(l<=r){
                mid=(l+r)/2;
                if(b[mid]<a[i]){
                    r=mid-1;
                    as=mid;
                }
                if(b[mid]>=a[i]){
                    l=mid+1;
                }
            }
            b[as]=max(a[i],b[as]);
        }
    }
    ans[0]=len+1;
    vector<int>A;
    for(int i=0;i<n;i++)A.push_back(a[i]);
    while(A.size()!=0){
        int k=A[0];
        for(int i=0;i<A.size();i++){
            if(A[i]<=k){
                k=A[i];
                A.erase(A.begin()+i);
                i--;
            }
        }
        ans[1]++;
    }
    cout<<ans[0]<<endl;
    cout<<ans[1]<<endl;
    return 0;
}

另一个数据
89 126 85 103 101 86 86 98 96 99 89 81 101 92
79 77 82 97 83 100 78 72 79 97 71 80 98 89 69
74
答案
12
6
第一问有问题

  • 写回答

2条回答 默认 最新

  • 雨下,听风 2023-01-18 23:33
    关注

    ?......你是要正确代码吗?
    以下两个代码可供参考

    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 100010;
    
    int f[N];
    int g[N];
    int h[N];
    int n;
    
    int main()
    {
        while (scanf("%d", &h[n]) != EOF) n ++;
        
        int res = 0;
        for (int i = 0; i < n; i ++ ) 
        {
            f[i] = 1;
            for (int j = 0; j < i; j ++ ) 
                if (h[j] >= h[i])    
                    f[i] = max(f[i], f[j] + 1);
            
            res = max(res, f[i]);
        }
        
        printf("%d\n", res);
        
        int cnt = 0;
        for (int i = 0; i < n; i ++ )
        {
            int k = 0;
            while (k < cnt && g[k] < h[i]) k ++;
            g[k] = h[i];
            if (k >= cnt) cnt ++;
        }
        
        printf("%d\n", cnt);
        
        return 0;
    }
    
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 100010;
    
    int f[N];  //f数组存储的是最长不上升序列(注意不是子序列) 
    int g[N];  //g数组存储的是最长上升序列(注意不是子序列)
    int h[N];
    int n;
    
    int main() 
    {
        while (cin >> h[++ n]);
        n --;
        
        int res = 1, cnt = 1;
        f[1] = g[1] = h[1];
        for (int i = 2; i <= n; i ++ ) 
        {
            if (h[i] <= f[res]) f[++ res] = h[i];
            else
            {
                int k = upper_bound(f + 1, f + res + 1, h[i], greater<int>()) - f;
                f[k] = h[i];
            }
            
            if (h[i] > g[cnt]) g[++ cnt] = h[i];
            else
            {
                int k = lower_bound(g + 1, g + cnt + 1, h[i]) - g;
                g[k] = h[i];
            }
        }
        
        printf("%d\n%d\n", res, cnt);
        
        return 0;
    }
    

    实在不会可以去看看


    这个也可以看看

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 修改了问题 1月17日
  • 创建了问题 1月17日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装