所谓贪心算法是指,在对问题求解时,总是做出在
当前看来是最好的选择
。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的
局部最优解
。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
贪心算法的实现框架
从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;
贪心算法:
例题,一个army的 vjC/D题
从最左方开始,寻找范围内第一个节点,即驻扎点,标记后,再寻找右方新的第一个超出范围的点,然后重新开始
#include <iostream>
#include<algorithm>
using namespace std;
int army[1005];
int r,n;
void solve()
{
int i=0,ans=0;
while(i<n)
{
int s=army[i++];//第一个点的坐标,++后进入下一个点,其实等价于 s=army[i];i=i+1;
while(i<n&&army[i]<=s+r) i++;
int p=army[i-1];//此处不能忘了减一,因为此时的i已经超出了范围,需要减一
while(i<n&&army[i]<=p+r) i++;
ans++;
}
cout<<ans<<endl;
}
int main()
{
while(cin>>r>>n&&(r!=-1&&n!=-1))
{ int num=0;
for(int i=0;i<n;i++)
cin>>army[i];
sort(army,army+n);
solve();
}
return 0;
}