学习算法一:贪心算法

本文围绕贪心算法展开,先给出其初步定义。接着以会场安排问题为例,介绍题目描述、输入输出要求。解题思路是考虑结束时间,因结束快时间利用程度高。还分享解题感悟,指出用sort函数和结构体解决排序与匹配问题,强调找出思路和建立模型对贪心算法的重要性。

贪心算法的定义

在初步学习中的认知就是最优考虑,但是如果结合实际问题这个思想不知道是否可以延续下去请拭目以待。

贪心算法的题目

第一题:会场安排

题目描述

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相当于要找的最小会场数。)

输入

第1行有1个正整数k,表示有k个待安排的活动。接下来的k行中,每行有2个正整数,分别代表k个待安排的活动的开始时间和结束时间。时间以0点开始的分钟计。

输出

输出计算得到的最少会场数

样例输入
5
1 23
12 28
25 35
27 80
36 50
样例输出
3
题目思路

       这类题目的模式要找到一定的数学模型,再把其化成解决方法:

       如果我们寻找间隔时间最短不行,选择开始时间最短也不行,那就剩下在我们心中没有考虑到的结束时间。虽然有些奇怪但是考虑排除法,还有一种官方解释那就是只要结束的快,那么时间上利用程度就高。

        根据如上条件,我们可以很好的写出解题的代码:

#include <bits/stdc++.h>
//this hand file is new which has almost functions and is used to take part in 	competition
//because there is sort 
using namespace std;

struct event{
	int start;
	int end;
}vent[1024];

bool stand(event x, event y)
{
	return x.end<y.end;
}

int main()
{
	// write code here
	int n;
	cin >> n;
	for(int i=0;i<n;i++)
	{
		cin>>vent[i].start>>vent[i].end;
	}
	
	sort(vent , vent+n , stand);

	int num = 1;
	int j=0,k=1,;
	for(int i = 0 ; i < n  ; i++){
		if(vent[j].end<vent[k].start)
		{
			j=k;
			k++;
			num++;
		}
		else{
			k++;
		}
	}
	cout<<num;

	return 0;
}
解题感悟

       由于存在sort函数可以很好的解决排序问题,为了将开始与结束时间匹配,采取结构体的形式才可以更好的使用sort函数。在最后的计数中第一个已经是我们要挑选的事件所以num的起始值便是1。

       贪心算法最重要的是找出解题思路,建立数学模型,才能实现贪心,以上是鄙人的一点小看法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值