题目地址:点击打开链接
思路:和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;
}
大神地址: 点击打开链接