您的位置:首页 > 其它

hdu 1257 最少拦截系统

2013-05-04 19:06 375 查看
[align=center] [/align]

最少拦截系统

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 11515 Accepted Submission(s): 4531



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

怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

[align=left]Input[/align]
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

[align=left]Output[/align]
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

[align=left]Sample Input[/align]

8 389 207 155 300 299 170 158 65


[align=left]Sample Output[/align]

2


[align=left] 分析: 需开一个数组,来存放当前已有的拦截系统的能打到的高度。每次来个炮弹,我们就遍历这个数组,在这个数组找到第一个能打这个炮弹的拦截系统,并更新这个系统能打到的高度。注意哟,同一高度的炮弹可以用同一个拦截系统打。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]已ac的代码:[/align]
#include<stdio.h>
#include <iostream>
using namespace std;
int main()
{
int n,a[30000],b[30000],j;
int count=0,max;
int k;
while(scanf("%d",&n)!=EOF)
{
count=1;
j=0;
b[0]=30000;      //没有炮弹来的时候 第一个拦截系统能打到最高 30000
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++) cin>>a[i];  //输入来的导弹高度

max=a[0];
b[0]=a[0] ;      //b[]数组是用来存放当前已有的拦截系统能打到的最高高度
for(int i=1;i<n;i++)
{
for(k=0;k<=j;k++) //每次来一个炮弹都要把 b[]数组从头找出第一个就能打到此炮弹的拦截系统
if(b[k]>=a[i]) { b[k]=a[i]; break; }  //如果在 b[]数组中找到能打到刚来的炮弹
//  就用这个炮弹的高度来更换这个拦截系统的高度
if(k>j) //如果没找到就增加一个来接系统来打这个刚来的炮弹
{
j++;
b[j]=a[i]; // 把这个新来的拦截系统的高度记录到 数组 b[]中
count++;
}
}

cout<<count<<endl;

}
return 0;
}


[align=left] [/align]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: