【题目描述】
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。
【输入】
n颗依次飞来的高度(1≤n≤1000)。
【输出】
要拦截所有导弹最小配备的系统数k。
【输入样例】
389 207 155 300 299 170 158 65
【输出样例】
2
【提示】
输入:导弹高度: 4 3 2
输出:导弹拦截系统k=1
#include<bits/stdc++.h>
using namespace std;
int s[1005];
int l[1005];
int main()
{
int n;
n=1;
memset(s,0,sizeof(s));
memset(l,0,sizeof(l));
while(cin>>s[n])
{
n++;
}
int k=1;
l[k]=s[1];
int p=0;
for(int i=2;i<n;i++)
{
p=0;//每次都要设置为0,
for(int j=1;j<=k;j++)//一共有k套系统
{
if(l[j]>=s[i])//从k套系统选择
{
if(p==0)
p=j;
else if(l[j]<l[p]) p=j;//贪心,选择最小系统中最小的值,然后后面会把这个比最小系统还小的值赋值给这个最小系统的最小值
}
}
if(p==0)
{
k++;
l[k]=s[i];
}
else
{
l[p]=s[i];
}
}
cout<<k<<endl;
return 0;
}
分析:
1.首先这题是贪心,是贪心从k套系统选择最小的系统来判断选择哪个系统比如说这个的案例最小都是 155 和 65 当出现一个下降 数列最小是66 的时候我们应该选择65这个系统
2.解题过程:
a.把第一个l[1]设置为第一个系统,如果第二个导弹比第一个小哪l[1]=s[2]
c.当有k个系统的时候就是每次来一个导弹就要比较最小的系统这个数与这个导弹的值,如果最小系统不小于这个导弹那么就是把 这个导弹的值赋值给最小系统,这里的p用法可以了解一下