本文主要是介绍导弹拦截(贪心策略),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目分析
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个系统
}
这篇关于导弹拦截(贪心策略)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!