题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
解题思路:题目的关键句是“第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.”这句话的意思就是给你一组数据,从头到尾选出需要拦截系统的高度(较小值),做法是依次保存现在每个拦截系统能拦截的最高的高度,接下来输入的每一个高度,依次和这若干拦截系统的现在所能拦截的最高高度进行比较,若某次小于这个高度,就替代这个高度,(并直接退出当前循环);若比这些拦截系统的高度都高,就重新创造一个拦截系统。
测试数据:8 7 6 5 6 3 2 4 1
答案:2(0 2 4)
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a,b[100000];//a为导弹的高度,b数组来保存拦截系统能够拦截的高度 4 int main() 5 { 6 int n,cnt,j; 7 while(cin>>n){ 8 memset(b,0,sizeof(b));//b用来保存拦截系统能够拦截的最大高度 9 cnt=0;//计算拦截系统的个数 10 for(int i=0;i<n;i++){ 11 cin>>a; 12 for(j=0;j<=cnt;j++)//每次都用较小的高度来替换b中的数值 13 if(b[j]>=a){b[j]=a;break;}//如果拦截系统能够拦截就拦截 14 if(j>cnt)b[++cnt]=a;//如果拦截系统都不能够拦截,就只能够再重新用一个拦截系统了 15 } 16 cout<<cnt<<endl; 17 } 18 return 0; 19 }