欢迎访问XYNUOJ
1250: 导弹拦截问题(NOIP1999)需要系统个数
时间限制: 1 Sec 内存限制: 128 MB
提交: 8 解决: 3
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]
题目描述
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,因此1套系统可能不能拦截所有的导弹。
输入
输入数据只有一行,数据之间用空格隔开,表示导弹依次飞来的高度(<=100 枚,<=30000 )。
输出
一个数据,该数据表示若要拦截所有导弹至少要多少套这样的系统。
样例输入
300 150 120 540 360 471 140 364 146 340
样例输出
4
/* **类型:贪心算法 **题目来源:XYNU **时间:2017/7/31 */ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn = 1000+10; const int INF = 30000+10; //导弹高度不会超过 30000 int a[maxn]; //存导弹的高度 int h[maxn]; // h[i] 表示第 i 个导弹系统拦截的最低高度 int main() { int n = 0; int b; while(scanf("%d",&b)!=EOF) { a[n++] = b; //因不知输入多少数据 } for(int i = 0; i < n; i++) { h[i] = INF; //初始化保证每一个拦截系统都能拦截所有的导弹 } for(int i = 0; i < n; i++) { for(int j = 0; j <= i; j++) //往前找开发了的导弹系统,看是否能拦截当前导弹, 最坏的结果是每个导弹都需要一个新的导弹系统来拦截,所以遍历到 i { if(h[j] >= a[i]) //一旦找到符合条件的拦截系统 { h[j] = a[i]; // 第 j 个拦截系统拦截了第 i 个导弹 , 更新它的目前可以拦截的导弹的高度 break; //第 i 个导弹已经拦截,跳出里面那层循环 } } } int tot = 0; for(int i = 0; i < n; i++) //计算总共用了几个导弹系统 if(h[i] != INF) //如果第 i 个导弹系统的高度不等于初始值说明它用过 tot++; printf("%d\n", tot); return 0; }