拦截导弹

来源:互联网 发布:mpi编程double 编辑:程序博客网 时间:2024/04/29 12:03

问题 P: 拦截导弹

时间限制: 1 Sec
内存限制: 125 MB
提交: 33
解决: 12
提交状态

题目描述

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


输入

每个测试文件只包含一组测试数据,每组输入若干个整数,表示导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)。


输出

对于每组输入数据,第一行输出这套系统最多能拦截多少导弹,第二行输出如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。


样例输入

389 207 155 300 299 170 158 65

样例输出

62

提示

提交状态
这个不得不说!求最大拦截导弹用动态规划很好做,就是最小拦截系统怎么算呢?网上是这么算的
比如对于测试样例389 207 155 300 299 170 158 65
因为300 299都比155大,所以第一次拦截只能是389 207 155 65
第二次拦截为300 299 170 158就是这个意思!
#include<stdio.h>int main(){    int a[100],i,j,n,f=0,maxlen[100],len,maxlen1,sum=0,max1;    while(scanf("%d",&n)!=EOF)    {        a[f++]=n;    }    maxlen[0]=1;    for(i=1;i<f;i++)    {        len=0;        for(j=0;j<i;j++)        {            if(a[j]>a[i])            {                if(maxlen[j]>len)                {                    len=maxlen[j];                }            }        }        maxlen[i]=len+1;    }    maxlen1=maxlen[0];    for(i=1;i<f;i++)    {        if(maxlen[i]>maxlen1)        {            maxlen1=maxlen[i];        }    }    for(i=0;i<f;i++)    {        if(a[i]==0)            continue;        else        {            sum++;            max1=a[i];            for(j=i+1;j<f;j++)            {                if(a[j]!=0&&a[j]<=max1)                {                    max1=a[j];                    a[j]=0;                }            }        }    }    printf("%d\n%d",maxlen1,sum);} /**************************************************************    Problem: 20907    User: liuchen8899    Language: C++    Result: 正确    Time:1 ms    Memory:1092 kb****************************************************************/


0 0
原创粉丝点击