贪心算法的定义
在初步学习中的认知就是最优考虑,但是如果结合实际问题这个思想不知道是否可以延续下去请拭目以待。
贪心算法的题目
第一题:会场安排
题目描述
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相当于要找的最小会场数。)
输入
第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。
贪心算法最重要的是找出解题思路,建立数学模型,才能实现贪心,以上是鄙人的一点小看法。
本文围绕贪心算法展开,先给出其初步定义。接着以会场安排问题为例,介绍题目描述、输入输出要求。解题思路是考虑结束时间,因结束快时间利用程度高。还分享解题感悟,指出用sort函数和结构体解决排序与匹配问题,强调找出思路和建立模型对贪心算法的重要性。
3057

被折叠的 条评论
为什么被折叠?



