贪心算法思想是指在求解问题时,总是作出当前看起来最好的选择,即局部最优解,(选择策略必须满足无后效性,无后效性:某个状态以后的过程不会影响以前的状态,只与当前状态有关)从而达到或接近整体的最优解,贪心算法的关键是算法的设计。
列举几道题理解分治思想
1.排队打水问题
问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
最少的花费时间
样例输入
4 2
2 6 4 5
样例输出
23
分析:
若要消耗的总时间最少就要让等待的总时间最少,就要让打水快的人先打。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1000],b[1000],n,r;
cin>>n>>r;
int i,sum=0;
for(i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
for(i=0;i<r;i++)
b[i]=a[i];
for(i=r;i<n;i++)
b[i]=b[i-r]+a[i];
for(i=0;i<n;i++)
sum=sum+b[i];
cout<<sum;
}
2.拦截导弹问题
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统
输入格式
n颗依次飞来的高度(1≤n≤1000)。
输出格式
要拦截所有导弹最小配备的系统数k。
样例
输入样例
389 207 155 300 299 170 158 65
输出样例
代码:
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int s[1005];
int main()
{
int n=1,k=1;
while(cin>>a[n])
n++;
s[k]=a[1];
int idx;
for(int i=2;i<=n;i++)
{
idx=0;
for(int j=1;j<=k;j++)
{
if(s[j]>=a[i])
{
if(idx==0){
idx=j;
}
else if(s[idx]>s[j])
{
idx=j;
}
}
}
if(idx==0)
{
k++;
s[k]=a[i];
}
else
{
s[idx]=a[i];
}
}
cout<<k<<endl;
return 0;
}