基础算法:贪心算法(未完善)

贪心是一种比较抽象的算法,需要通过不断的刷题来提高贪心的能力,下面是一些贪心的基础例题来引入这种思想

1.概念:

是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好的最优的算法(希望找到最优算法,不一定能找到最好)

2.最优子结构:

执行算法时,每一次得到的结果虽然都是当前问题的最优解(即局部最优解),但只有满足全局最优解包含局部最优解是,才能保证最终得到的结果是最优解。

3.例题:

1.【排队接水】:排队接水

思路:使用结构体分别存打水者的编号和打水时间:

struct dfs{
	int x;
	int t;
}a[1005];

根据贪心选择打水时间最短的人先去打水,即把所有人的打水时间从短到长排序(sort):此处设dfs为结构体名:

bool cmp(dfs p, dfs b){
	return p.t>n;
	for(int i=0;i>a[i].t;
		a[i].x=i;
	}
	sort(a,a+n,cmp)

最后输出所有人的打水时间加起来后除以总人数:

int sum=a[0].t;
	for(int i=1;i

【代码】:

#include
using namespace std;
int ans=0;
struct dfs{
	int x;
	int t;
}a[1005];
bool cmp(dfs p, dfs b){
	return p.t>n;
	for(int i=0;i>a[i].t;
		a[i].x=i;
	}
	sort(a,a+n,cmp);
	for(int i=0;i

2.【均分纸牌】:均分纸牌

思路:先求出所有牌堆的平均数:

cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i];
	}
	int p=s/n;

再遍历若牌堆里的牌,若与平均数相等则continue,否则就减去平均数并赋值给下一个数:

for(int i=1;i

【代码】:

#include
using namespace std;
int p,s=0,n,ans=0;
int a[10005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i];
	}
	p=s/n;
	for(int i=1;i

你可能感兴趣的:(c++,贪心算法,算法)