HDU 1257 最少拦截系统

/*
若N个数 为递增序列
则最多需要N个导弹系统
贪心 + DP 见注释
*/
#include
<stdio.h>
#define MAX 100000
int height[MAX]; //height[i]表示第i个防导弹系统所能防御的最大高度
int t; //t个数
int high; //height[i]中 最高高度 的 下标
int a[MAX];
int main(){
int i,j; //j 导弹系统个数
while(scanf("%d",&t)!= EOF){
scanf(
"%d",&a[0]);
height[
0] = a[0];
high
= 0;
j
= 1;
for(i = 1; i < t; i++){
scanf(
"%d",&a[i]);
if(a[i] >= height[high]){
height[j
++] = a[i];
if(height[j - 1] > height[high]){ //更新high值
high = j - 1;
}
}
else { //贪心选择高度最小的且比能够抵抗住a[i]的导弹
int k,min = 0X7FFFFFFF,min_index;
for(k = 0; k < j; k++){
if(height[k] >= a[i] && min > height[k] - a[i]){
min
= height[k] - a[i];
min_index
= k;
}
}
height[min_index]
= a[i];
}
}
printf(
"%d\n",j);
}
return 0;
}
posted @ 2011-04-09 02:17  L..  阅读(348)  评论(0编辑  收藏  举报