解题思路:【要充分理解题意,不可断章取义】
贪心:每个防御系统要发挥其最大性能,
举例:
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\n",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