题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽 然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷 达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所 有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救 了,请帮助计算一下最少需要多少套拦截系统.
这题白皮书上也有,他不是求最多拦截多少导弹(那样的话就是最长不下降子序列问题),而是求最少需要多少系统才能把导弹全部拦截下来,那么显然每一发导弹来临的时候我们都得把它拦截下来,如果一枚导弹来临的时候我们之前有一个系统拦截过的最后一个导弹把它高,那么就可以用这个系统来拦截它,吐过符合条件的有多个,显然用符合条件的系统里目前最低高度最小的那个拦截,因为其他最低高度比较高的还可以为拦截比当前导弹更高的导弹做准备。如果当前导弹很高,没有没有一个系统可以拦截下来,那就只能新开一个系统了。代码:
1 //贪心
2 #include<iostream>
3 #include<cstdio>
4 using namespace std;
5 const int maxn=10005;
6 int n;
7 int a[maxn];
8 int f[maxn];
9 int cnt;
10 int pos;
11 bool flag;
12 int main()
13 {
14 while(scanf("%d",&n)!=EOF)
15 {
16 cnt=0;
17 for(int i=1;i<=n;++i)scanf("%d",&a[i]);
18 for(int i=1;i<=n;++i)
19 {
20 int cha=10000000;
21 flag=0;
22 for(int j=1;j<=cnt;++j)
23 {
24 if(f[j]>=a[i]&&f[j]-a[i]<cha)pos=j,flag=1,cha=f[j]-a[i];
25 }
26 if(flag)f[pos]=a[i];
27 else f[++cnt]=a[i];
28 }
29 printf("%d\n",cnt);
30 }
31 return 0;
32 }