题目地址:点击打开链接
思路:和HDU 1051差不多,只不过那道题事先得排序,这道题,直接动态规划就可以解决,不用用贪心,很多人会误认为每个导弹应该选能拦截它的系统中最低的那个,这样可以减少不必要的下降,其实刚开始开一个系统即可,随便降,遇到导弹拦截不住,再开一个就行,开系统的条件是之前所有的系统都拦截不住,每个系统都是随便降,举个简单的例子,1551,3,1550,其实没必要拦截1551,1550的是一个系统,拦截3的是一个系统,写点长的例子自己理解吧,总而言之,这道题就是求,下降子序列的条数
超时代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a[10000],visit[10000]; int main() { int n,i,k,max1,sum; while(scanf("%d",&n) != EOF) { memset(visit,0,sizeof(visit)); k = 0; sum = 0; for(i=0; i<n; i++) { scanf("%d",&a[i]); } while(k < n) { max1 = 4000; for(i=0; i<n; i++) { if(!visit[i] && a[i] <= max1) { max1 = a[i]; visit[i] = 1; k++; } } sum++; } printf("%d\n",sum); } return 0; }AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a[30000],b[30000]; int main() { int n,i,j,k; while(scanf("%d",&n) != EOF) { k = 0; for(i=0; i<n; i++) { scanf("%d",&a[i]); } for(i=0; i<n; i++) { for(j=0; j<k; j++) { if(a[i] < b[j]) { b[j] = a[i];//b数组保存的是每条系统目前的最低值 break; } } if(j == k) { b[k] = a[i]; k++; } } printf("%d\n",k); } return 0; }