问题标题: 酷町堂:2804 导弹拦截

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

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

输入导弹依次飞来的高度(雷达给出的高度数据是 0<=h<=50000 的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入描述 Input Description

1 行,若干个整数(个数 ≤100000 )

输出描述 Output Description

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

 

o3没水过去,TLE10,求优化

#include<iostream> 
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
int a[100005],b[100005],c[100005],n=1,ans=-1,cnt;
int main(){
    while(cin>>a[n++]);
    n--;
    for(int i=1;i<=n;i++){
        int maxn=-1;
        for(int j=1;j<i;j++){
            if(a[j]>=a[i]){
                if(b[j]>maxn) maxn=b[j];
            }
        }
        b[i]=maxn+1;
        if(b[i]>ans) ans=b[i];
    }
    for(int i=1;i<=n;i++){
        bool f=0;
        for(int j=1;j<=cnt;j++){
            if(a[i]<=c[j]){
                c[j]=a[i];
                f=1;
                break;
            }
        }
        if(!f){
            c[++cnt]=a[i];
        }
    }
    cout<<ans<<endl<<cnt;
    return 0;
}

 


0
0
我要回答