hdu 1257 最少拦截系统(贪心)

解题思路:【要充分理解题意,不可断章取义】

贪心:每个防御系统要发挥其最大性能,

举例:

 Input : 9 389 207 155 300 299 170 155 158 65

Output: 2

不是后者大于前者便部署一个新的防御系统,而是充分发挥所有防御系统的性能。

倒数第三个数 155 ,这枚导弹完全可以被第一防御系统所拦截,所以用两个系统便可以防御所以导弹。

先给出AC代码:

#include<stdio.h>
int narr[10003];
int main(void)
{
    int n,i,k,flag,h;
    while(scanf("%d",&n)!=EOF&&n)
    {
        k=0;
        for(i=0; i<n; i++)
            scanf("%d",&narr[i]);
        while(1)
        {
            h=30005;
            flag=0;
            for(i=0; i<n; i++)
            {
                if(narr[i]<=h&&narr[i]>0)
                {
                    h=narr[i];
                    flag=1;
                    narr[i]=-1;
                }
            }
            if(flag)k++;
            else break;
        }
        printf("%d
",k);
    }
    return 0;
}

  代码解析:

将所有导弹高度放入到一个数组中。

从第一开始扫描,如果后一个小于前一个,且大于0,则向后递推扫描,同时将扫描过的数值重新赋值-1,遍历所有元素。如果没有元素了,则不会进入for中的if,则,flag不会被赋值1,说明所有元素都已遍历完,且都被赋值为-1。遍历完 k++;

 Input :    9 389 207 155 300 299 170 155 158 65

第一遍扫描     -1   -1    -1                      -1         -1    -->k=1

则数组中元素   -1   -1   -1 300 299  170  -1  158

第二遍扫描                        -1    -1    -1         -1         -->k=2

数组中元素以全为-1 不在进入 if 。flag=0;跳出while(1)循环。

则 Output k 

原文地址:https://www.cnblogs.com/A--Q/p/5711354.html