![在这里插入图片描述](https://img-blog.csdnimg.cn/20201008211537997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RLS0RPVVpJ,size_16,color_FFFFFF,t_70#pic_center)
题目分析
noip老经典贪心问题了
使用贪心策略,现在对于导弹i,和已经存在的k个系统,导弹i现在面临两种情况。
1、加入已存在的k个系统之中的一个系统之中。
当然前提条件是至少比其中一个系统的最小值小,那么如何用更少的系统,去装下更多的导弹呢?导弹i当然要选择能加入的导弹最小值的距离最近的,这样系统里的导弹才能更加的紧凑,不浪费空间。局部贪心导致最优解。
2、无法加入已存在的任何一个系统
新开辟一个系统。
code:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int arr[1005];
int l[1005];
int main()
{
//导弹拦截的贪心策略
//首先选取第一个导弹为第一组的最低拦截度
//之后导弹只能比其更低
int x,k=1,n=0;
while (cin >> x)
{
arr[++n] = x;
}
l[k] = arr[1];
for (int i = 2; i <= n; i++)
{
int p = 0;//导弹安家指针 遍历所有的导弹拦截设备
for (int j = 1; j <= k; j++)
{
if (l[j] >= arr[i])//i个导弹能够放进去
{
if (p == 0)
{
p = j;//这个地方先标记
}
else if (l[j]< l[p])//选取最小的 选取与i个导弹最接近的
{
p = j;
}
}
}
if (p == 0)//i没有能放入某一堆的
{
l[++k] = arr[i];//放下个去
}
else
{
l[p] = arr[i];//放进刚刚标记的系统里面
}
}
cout << k;//输出k个系统
}