贪心算法-会议安排问题
算法设计与分析课件--贪心法-会场安排问题

4.1 概述
◼ 贪心法基本思想的推论
❖精髓是“今朝有酒今朝醉”; ❖每个阶段的决策一旦做出就不可更改。不允许回溯。 ❖ 贪心法根贪心法的实际意义和学术价值:
❖可算得上是最接近人们日常思维的一种解题策略; ❖简单、直接和高效; ❖对范围相当广泛的许多实际问题通常都能够产生整
A {1}; //首先选择会议1
k 1;
//已被选择会议集合中最晚结束的会议(k)
for m 2 to n do
if B[m] >= E[k] then //会议m开始时间不小于会议k结束时间
A A ∪ {m}; //将会议m加入到集合A中
k m;
//此时集合A中最晚结束的会议为m
return A;
✓ 因此,会场安排问题的最优子结构性质得到证明
19
12
4.2 会场安排问题
◼ 几种贪心选择策略:
❖选择最早开始时间且不与已安排会议重叠的会议: ✓但如果会议的使用时间无限长,如此选择策略就只 能安排1个会议来使用资源。不可行。
❖选择使用时间最短且不与已安排会议重叠的会议: ✓但如果会议的开始时间最晚,如此选择策略也就只 能安排1个会议来使用资源。不可行。
❖选择最早结束时间且不与已安排会议重叠的会议: ✓如果选择开始时间最早且使用时间最短的会议,较 为理想。而此即结束时间最早的会议。可行。
13
4.2 会场安排问题
◼ 求解步骤:
❖步骤1:初始化,并按会议结束时间非减序排序。
✓开始时间存入数组B,结束时间存入数组E中; ✓按照结束时间的非减序排序E,B需做相应调整; ✓集合A存储解。如果会议i在集合A中,当且仅当其被选中。
6
4.1 概述
◼ 贪心法基本思想的推论
ACM_区间调度问题(贪心)

ACM_区间调度问题(贪⼼)Meetings 系列⼀Problem Description:多年之后的⼴财ACM编协如⽇中天,下系多个部门,且编协成员⼏近过百。
这⼀次,为了庆祝ACM编协近年飞速的发展,各部门都决定在同⼀天召开会议。
请注意:这次由于资源紧张,仅申请到⼀个报为了简化问题,作如下规定:(1)每⼀场会议M(a,b)表⽰从a时刻开始,b时刻结束(其中,a,b都为整数且8 <= a < b <= 20);(2)同⼀时段内报告厅仅允许⼀个部门进⾏开会,不同部门交接时可忽略不同场次交换耗费的时间。
Input:输⼊包含多组测试数据,每组数据第⼀⾏输⼊整数n(0<n<=20)表⽰⼀共有n场会议要安排。
下⾯n⾏依次输⼊每⼀场会议的开始跟结束时刻a,b。
Output:每⼀组测试输出可以安排的场次的最⼤数⽬,占⼀⾏。
Sample Input:312 1512 1314 18511 1213 1818 2013 1616 17Sample Output:24解题思路:贪⼼策略:将所有区间按右端点坐标(结束时间)从⼩到⼤排序,顺序处理每个区间。
如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。
注意:起始时间和结束时间在8-20范围内。
算法证明--->AC代码:1 #include<bits/stdc++.h>2using namespace std;3struct NODE{4int st,ed;5 }node[21];6bool cmp(NODE x,NODE y){7return x.ed<y.ed; //按结束时间早的升序排8 }9int main()10 {11int n,num,k,t,s,e;12while(cin>>n){13 k=-1;14for(int i=1;i<=n;++i){15 cin>>s>>e;16if(s>=8 && e<=20){node[++k].st=s;node[k].ed=e;}17 }18 sort(node,node+k+1,cmp);19 num=t=0;20for(int i=0;i<=k;++i)21if(t<=node[i].st){num++;t=node[i].ed;}22 cout<<num<<endl;23 }24return0;25 }也可以使⽤STL中的pair<int,int>。
贪心算法(会场安排问题、区间选点)

贪⼼算法(会场安排问题、区间选点)学习算法课程之后的第⼀次记录,渐渐的,程序设计考虑的因素增多,程序=数据结构+算法,这个等式让我深有体会。
从开始简单的C++编程,再到选择合适数据结构,现在需要更进⼀步,从算法层次上考虑程序执⾏的效率。
我对算法的理解是⽤更少的开销获得更优的执⾏效果。
分治法、动态规划在此之前没有记录下来,学到贪⼼算法的时候,觉得需要总结⼀下学过的东西,也能更好的理解。
动态规划的设计,要满⾜最优⼦结构性质和重叠⼦问题,采⽤⾃底向上的策略,计算出最优值,找到整体最优解。
这个过程有时候挺难的,主要在写出递归式,要⾃底向上填表。
贪⼼策略有点像动态规划,但在⼀些⽅⾯是不同的,有时候贪⼼算法的思想更容易想到。
它要满⾜⼦问题最优⽽得到整体最优?两个条件:最优⼦结构性质和贪⼼选择性质。
满⾜贪⼼选择性质⼀定满⾜最优⼦结构性质,⽽满⾜最优⼦结构性质不⼀定满⾜贪⼼选择性质,⽐如背包问题可以⽤贪⼼算法解决,⽽0-1背包问题只能⽤动态规划。
典型的贪⼼问题活动安排,有n个活动,给出开始时间和结束时间,要尽可能安排多的活动(时间互相不冲突)。
解决这个问题正确的贪⼼思想是以每个活动结束时间为⽐较变量,按结束时间升序排好活动次序,接着就进⾏⽐较选择。
⽽会场安排问题与活动⼜有些不同之处,下⾯是我的解题过程。
7-2 会场安排问题 (20 分)假设要在⾜够多的会场⾥安排⼀批活动,并希望使⽤尽可能少的会场。
设计⼀个有效的贪⼼算法进⾏安排。
(这个问题实际上是著名的图着⾊问题。
若将每⼀个活动作为图的⼀个顶点,不相容活动间⽤边相连。
使相邻顶点着有不同颜⾊的最⼩着⾊数,相应于要找的最⼩会场数。
)输⼊格式:第⼀⾏有 1 个正整数k,表⽰有 k个待安排的活动。
接下来的 k⾏中,每⾏有 2个正整数,分别表⽰ k个待安排的活动开始时间和结束时间。
时间以 0 点开始的分钟计。
输出格式:输出最少会场数。
输⼊样例:51 2312 2825 3527 8036 50输出样例:3#include<iostream>#include<algorithm>using namespace std;struct node {int begin;int end;int flag;//标记该活动是否被安排,0表⽰未安排,1表⽰已安排}t[10001];int cmp(const node &a,const node &b)//⽐较规则:以结束时间升序排列{return a.end<b.end;}int main(){int i,j,n;node temp;cin>>n;for(i=0;i<n;i++){cin>>t[i].begin>>t[i].end;t[i].flag=0;}sort(t,t+n,cmp);int sum=0;//总共需要的会场数量for(i=0;i<n;i++)//⽅法2{if(!t[i].flag)//找到未安排的活动,进⾏场地安排{sum++;int p=i;for(j=p+1;j<n;j++)//当前活动结束时间与下⼀个活动开始不相交,则安排到同⼀个会场{if(t[p].end<=t[j].begin&&!t[j].flag){p=j;t[j].flag=1;}}t[i].flag=1;}}cout<<sum;return0;}View Code贪⼼策略为:把尽可能多的时间互不冲突的活动安排到⼀个会场,若活动时间交叉,则在安排到另⼀个会场。
0021算法笔记——【贪心算法】贪心算法与精彩活动安排问题

0021算法笔记——【贪心算法】贪心算法与活动安排问题1、贪心算法(1)原理:在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
(2)特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。
能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。
1)贪心选择性质所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心算法可行的第一个基本要素。
贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
证明的大致过程为:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。
做了贪心选择后,原问题简化为规模更小的类似子问题。
然后用数学归纳法证明通过每一步做贪心选择,最终可得到问题的整体最优解。
其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。
2)最优子结构性质当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
(3)贪心算法与动态规划算法的差异:动态规划和贪心算法都是一种递推算法,均有最优子结构性质,通过局部最优解来推导全局最优解。
两者之间的区别在于:贪心算法中作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留,贪心算法每一步的最优解一定包含上一步的最优解。
贪心算法 活动安排问题

活动安排问题,对每项活动的按照结束时间非减序排列。
然后选第一个。
按照第一个的结束时间来看接下去怎么选,以此类推。
贪心选择性质的证明:
1.活动安排问题的一个最优解是以贪心选择开始。
即最优解包含第一个活动(叫做活动1)。
证明:假设有一个最优解叫做A。
它的活动也是以结束时间的非减序进行排列。
假设A中第一个活动叫做K。
如果K是我们的活动1,则A就是以活动1开始的。
如果K不是活动1.则把K从A中去掉,并加上活动1,而且活动1是相容的是因为活动1 的
结束时间最早。
所以证明了活动安排问题的一个最优解是以贪心选择开始。
最优子结构的证明:
把起始时间大于活动1的结束时间的活动去掉,A也可以把K去掉,这样子有一个递推的关系就是(总活动中)接下去那个与活动1相容的解必然可以相容在最优解(A-K)里面。
(因它又可以化为一个贪心选择的开始)所以每一步做出的贪心选择将使得原问题化为规模变小的相似的子问题。
贪心算法解决活动安排问题报告

1.引言:贪心法是一种改进了的分级处理方法。
用贪心法设计算法的特点是一步一步地进行,每一步上都要保证能获得局部最优解。
每一步只考虑一个数据,它的选取满足局部优化条件。
若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。
这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。
贪心算法总是做出在当前看来是最优的选择,也就是说贪心算法并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心算法可以得到最优解或较优解。
2.贪心算法的基本思想及存在问题贪心法的基本思想:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。
当达到某算法中的某一步不能再继续前进时,算法停止。
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
3.活动安排问题:3.1 贪心算法解决活动安排问题学校举办活动的安排问题是用贪心算法有效求解的一个很好例子。
活动安排问题要求安排一系列争用某一公共资源的活动。
用贪心算法可使尽可能多的活动能兼容的使用公共资源。
设有n个活动的集合{0,1,2,…,n-1},其中每个活动都要求使用同一资源,如会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动i都有一个要求使用该资源的起始时间starti和一个结束时间endi,且starti<endi。
如选择了活动i,则它在半开时间区间[starti,endi)内占用资源。
若区间[starti,endi)与区间[startj,endj)不相交,称活动i与活动j是相容的。
也就是说,当start j≥endi或starti≥endj时,活动i与活动j相容。
活动安排问题就是在所给的活动集合中选出最大的相容子活动集合。
C++贪心算法实现活动安排问题(实例代码)

C++贪⼼算法实现活动安排问题(实例代码)贪⼼算法贪⼼算法(⼜称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪⼼算法不是对所有问题都能得到整体最优解,关键是贪⼼策略的选择,选择的贪⼼策略必须具备⽆后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
具体代码如下所⽰:#include <cstdio>#include <iostream>#include <ctime>#include <windows.h>#include <algorithm>#include <fstream>using namespace std;struct activity{int no;int start;int finish;};bool cmp(const activity &x, const activity &y){return x.finish<y.finish;//从⼩到⼤排<,若要从⼤到⼩排则>}int greedySelector(int m,int solution[],struct activity activity[]){int number = 1;solution[0] = 1;int i,j = 0,counter = 1;for(i = 1;i < m ;i++){if(activity[i].start >=activity[j].finish){solution[i] = 1;j = i;counter++;}elsesolution[i] = 0;}cout << "The amount of activities is:"<<counter<<endl;cout << "The solution is:";for(i = 0 ;i < m ;i++){if (solution[i] == 1){cout << activity[i].no <<" ";}}return counter;}int main(void){LARGE_INTEGER nFreq;LARGE_INTEGER nBeginTime;LARGE_INTEGER nEndTime;ofstream fout;srand((unsigned int)time(NULL));int m,i,j,t;double cost;cout << "Please enter the number of times you want to run the program:";cin >> t;fout.open("activity.txt",ios::app);if(!fout){cerr<<"Can not open file 'activity.txt' "<<endl;return -1;}fout.setf(ios_base::fixed,ios_base::floatfield); //防⽌输出的数字使⽤科学计数法for (j = 0;j < t;j++){cout << "——————————————————The "<< j + 1 << "th test —————————————————"<<endl;m = 1 + rand()%100000;fout<<m<<",";int solution[m];activity activity[m];for( i = 0;i < m;i++){activity[i].no = i+1;activity[i].start = 1 + rand()%1000;while(1){activity[i].finish = 1 + rand()%10000;if(activity[i].finish > activity[i].start) break;}}QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&nBeginTime);sort(activity,activity+m,cmp);greedySelector(m,solution,activity);QueryPerformanceCounter(&nEndTime);cost=(double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;fout << cost << endl;cout << "\nThe running time is:" << cost << " s" << endl;}fout.close();cout << endl << endl;cout << "Success!" << endl;return 0;}总结以上所述是⼩编给⼤家介绍的C++贪⼼算法实现活动安排问题,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
贪心算法之会场安排问题

贪⼼算法之会场安排问题【问题描述】假设要在⾜够多的会场⾥安排⼀批活动,并希望使⽤尽可能少的会场。
(这个问题实际上是著名的图着⾊问题。
若将每⼀个活动作为图的⼀个顶点,不相容活动间⽤边相连。
使相邻顶点有不同颜⾊的最⼩着⾊数,相应于要找的最⼩会场数。
)【数据输⼊】由⽂件input.txt给出输⼊数据,第⼀⾏⼜⼀个正整数K,表⽰有K个待安排的活动。
接下来有K⾏数据,每⾏有两个正整数,分别表⽰K个待安排的活动的开始时间和结束时间。
【结束输出】输出最少会场数。
input.txt output.txt5 31 2312 2825 3527 8036 50来吧,帮你解决介个问题。
思路:按照俺的思路啊~遍历所有的活动时间,设⼀个int sum代表会场的个数,如果时间可叠加到前⾯已有活动的会场的,把活动加到已有会场的数组中;如不可叠加,则新加会场重新加⼀个数组把这个新会场加⼊到新数组中然后sum+1。
遍历到最后 sum则就是需要最少的会场的个数·····下次再来。
我回来了,上⾯的思路我尝试了,没试出来。
就换了⼀种思路,就是做标记,已经加⼊的会场标记为1 否则为0 就OK了代码下次贴上#include <stdio.h>#define LEN 6int sum=0;int mark[LEN];void squarePlan(int s[],int f[]){int k=1,j;int flag=1;mark[0]=mark[1]=1;while(flag==1){mark[k]=1;for(int m=k+1;m<=LEN;m++){if(mark[m]==0&&s[m]>=f[k]){mark[m]=1;k=m;}}sum++;for(j=2;j<LEN;j++){if(mark[j]==0){k=j;break;}}flag=0;for(int i=1;i<LEN;i++){if(mark[i]==0&&i!=j){flag=1;break;}}}}int main(){ int s[LEN],f[LEN];int n;FILE *fp_in,*fp_out;fp_in=fopen("input.txt","r");//打开⼀个输⼊流,读取input.txt⽂件fp_out=fopen("output.txt","w");//打开⼀个输出流,写output.txt⽂件if(fp_in==NULL){printf("open in file failed\n");return 0;}if(fp_out==NULL){printf("open out file failed\n");return 0;}fscanf(fp_in,"%d",&n);s[0]=0;f[0]=0;for(int i=1;i<=n;i++){fscanf(fp_in,"%d",&s[i]);//x坐标在此题中⽆⽤,⽽y坐标在x坐标之后写⼊。
贪心算法经典例题

贪心算法经典例题贪心算法是一种求解最优问题的算法思想,其核心理念是每一步都选择当前最优的策略,从而达到全局最优解。
贪心算法可以应用于许多经典问题,下面将介绍几个常见的贪心算法经典例题及相关参考内容。
1. 会议室安排问题题目描述:给定一组会议的开始时间和结束时间,求解如何安排会议,使得尽可能多的会议可以在同一时间段内进行。
解题思路:贪心算法可以通过每次选择结束时间最早的会议来求解。
首先将会议按照结束时间排序,选择第一个会议作为首先安排的会议,然后依次选择后续结束时间不冲突的会议进行安排。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)2. 零钱兑换问题题目描述:给定一定面额的硬币,求解如何用最少的硬币数量兑换指定金额的零钱。
解题思路:贪心算法可以通过每次选择面额最大且不超过目标金额的硬币来求解。
从面额最大的硬币开始,尽可能多地选择当前面额的硬币,并减去已经选择的硬币金额,直到金额为0。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《算法4》第1章:基础(ISBN: 9787302444627)3. 区间调度问题题目描述:给定一组区间,求解如何选择尽可能多的不重叠区间。
解题思路:贪心算法可以通过每次选择结束时间最早的区间来求解。
首先将区间按照结束时间排序,选择第一个区间作为首先选择的区间,然后依次选择后续结束时间不与已经选择的区间重叠的区间进行选择。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)4. 分糖果问题题目描述:给定一组孩子和一组糖果,求解如何分配糖果,使得最多的孩子能够得到满足。
解题思路:贪心算法可以通过每次选择糖果最小且能满足当前孩子的糖果来求解。
贪心算法解决会场安排问题、多处最优服务次序问题(含源代码)

西安邮电大学(计算机学院)课内实验报告实验名称:贪心算法专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:实验日期: 2014年5月22日1.实验目的及实验环境实验目的:通过实际应用熟悉贪心算法,并解决会场安排问题、多出最优服务次序问题实验环境:Visual C++ 6.0二. 实验内容1.会场安排问题.假设要在足够多的回厂里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算大进行安排(这个问题实际上是注明的图着色问题。
若将每一个活动作为图的一个顶点,不相容活动间用边相连。
使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数)2.多处最优服务次序问题设有n个顾客同时等待一项服务。
顾客i需要的服务时间为ti,1<=i<=n。
共有s处可以提供此项服务。
应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
三.方案设计1、设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。
如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。
若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。
也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。
直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。
也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。
当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。
实验二 贪心算法-最少活动会场安排问题

中原工学院计算机学院实验报告实验项目名称实验二、最少活动会场安排问题课程名称算法设计与分析学生姓名梁斐燕学生学号************所在班级网络14卓越学科专业网络工程任课教师吴志刚完成日期2016年月日实验二最少活动会场安排问题一、实验目的1.掌握贪心算法的基本概念和两个基本要素2.熟练掌握贪心算法解决问题的基本步骤。
3.学会利用贪心算法解决实际问题。
二、实验内容•问题描述:•题目一:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。
设计一个有效的贪心算法来进行安排,试编程实现。
•题目二:一辆汽车加满油后,可行使n千米。
旅途中有若干个加油站。
若要使沿途加油次数最少,设计一个有效算法,指出应在哪些加油站停靠加油。
•数据输入:个人设定,由键盘输入。
•要求:–上述题目任选一做。
上机前,完成程序代码的编写–独立完成实验及实验报告三、实验步骤㈠、数据结构与核心算法的设计描述提示:题目一:参考教材活动安排问题;有关队列操作参考数据结构。
void GreedySelector(int n, int *s, int *f, int *A) {//用集合A来存储所选择的活动A[1] = TURE; //默认从第一次活动开始执行int j = 1; //j记录最近一次加入到A中的活动for (int i = 2; i <= n; i++) { //f[j]为当前集合A中所有活动的最大结束时间//活动i的开始时间不早于最近加入到集合A中的j的时间f[j]if (s[i] >= f[j]) {A[i] = TURE; //当A[i]=TURE时,活动i在集合A中j = i;}else A[i] = FALSE;}}㈡、函数调用及主函数设计㈢程序调试及运行结果分析㈣实验总结在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。
通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。
会议安排问题贪心策略算法原理

会议安排问题贪心策略算法原理
嘿,朋友们!今天咱来聊聊会议安排问题贪心策略算法原理。
你想想看啊,就好比你面前有一堆工作任务,你得想办法安排得妥妥当当,对不?会议安排其实也差不多是这么个事儿。
贪心策略算法呢,就像是一个很会做决策的小机灵鬼。
比如说,我们有
好几个会议时间可以选择。
那它就会“贪心”地先挑那个它觉得最有利的时间。
举个例子,你本来想着先开那个不太重要的会议,结果贪心策略算法说:“嘿,先开那个重要又紧急的会议呀,这样不就能快点处理大事情啦!”
哎呀呀,它可真是一点都不拖泥带水呢!它会不断地从各种选择中,挑
选出当下看起来最好的那个。
这不就跟咱去超市买东西一样嘛,总是会先挑那个自己最需要、性价比最高的。
再比如,如果有多个会议室可以选择,它也会根据各种条件来决定,像会议室的大小啦、设备好不好啦之类的。
就好像你会挑那个最舒服、最适合你的座位一样。
有时候你可能会觉得,哎呀,它这样会不会太着急了,会不会忽略了一些其他因素呀。
别急呀,它虽然有时候可能会有点小瑕疵,但总体来说还是很厉害的呀!
在会议安排中,贪心策略算法能让我们快速地做出决策,让一切都井井有条。
就像一个经验丰富的指挥官,带领着我们把一场又一场的会议安排得明明白白。
我觉得吧,会议安排问题贪心策略算法原理真的很实用,它就像是我们的好帮手,能让我们更高效地处理会议相关的事情。
虽然它不是完美的,但真的能给我们带来很大的帮助呀!咱可得好好利用起来呢!。
oj贪心算法题目

oj贪心算法题目
贪心算法是一种常见的算法思想,它通过每一步的最优选择来达到整体的最优解。
在 OJ (Online Judge) 上也有许多贪心算法题目,比如:
1. 会场安排问题:有 n 个会议需要在同一天举行,每个会议有开始时间和结束时间,同一时间只能举办一个会议,如何安排使得举办的会议最多?
2. 区间选点问题:有 n 个区间,每个区间有左右端点,需要选取尽可能少的点,使得每个区间至少包含一个点,如何选点使得点的个数最少?
3. 分配糖果问题:有 n 个孩子需要分配糖果,每个孩子有一个评分,需要满足以下条件:每个孩子至少分配到一颗糖果,评分较高的孩子应该比评分低的孩子分配到更多的糖果,最少需要分配多少颗糖果?
4. 跳跃游戏问题:给定一个非负整数数组,每个元素代表你在该位置可以跳跃的最大长度,如何判断是否能够到达最后一个位置?
这些题目都可以通过贪心算法来解决,需要根据具体情况选择合适的贪心策略。
- 1 -。
贪心法解决活动安排问题

运用贪心算法解决活动安排问题李文治,陈平,谢华欣,韩月梅(陕西师范大学计算机科学学院09级软件工程,西安,710062)摘要:生活中经常可以遇到这样一些问题,需要对一些资源进行优化分配已达到资源利用率的最大化。
如对会场会议的安排、对赛场比赛的安排、课程的安排、以及扩展到电脑中操作系统对不同进程资源的分配问题。
使用贪心算法可以很快的解决此类安排问题。
关键词:活动安排安排;贪心算法;Using the greedy algorithm to solve the problem of activityarrangementLi Wenzhi, Chen Ping, Xie Huaxin, Han Y uemei( Shaanxi Normal University computer science institute of software engineering, Xi'an, 710062)Abstract:life can often encounter such problems, the need for some resource optimized allocation has achieve the maximization of resource utilization. As for the meeting venue arrangement, the Games arrangement, the arrangement of the courses, as well as an extension to the computer operating system on the process of different resource allocation problems. The use of greedy algorithm can quickly solve such arrangements.Keywords:activity arrangement; greedy algorithm;1引言生活中经常可以遇到这样一些问题,需要对一些资源进行优化分配已达到资源利用率的最大化。
会场安排问题(贪心)

会场安排问题(贪⼼)
思路:
能放在⼀个会场⾥的活动的前提是,当前活动的开始时间⼤于等于上⼀个活动的结束时间。
⾸先把⼀个活动的开始时间和结束时间放在两个数组中再进⾏排序,这样得到的就是最⼩开始时间和最⼩结束时间,k初值为0,只要当前的开始时间⼩于结束时间,k++,由于结束时间是降序的,如果不⼩于这个结束时间,就后移⼀位,这样就得到了会场的次数。
贪⼼算法的思想就是只考虑当前的情况。
⽽不顾虑全局最优,所以我们只要能保证下⼀个活动的开始时间能⼩于这个活动的结束时间就⾏。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int a[10005],b[10005];
for(int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
sort(a,a+n);
sort(b,b+n);
int k = 0,j = 0;
for(int i = 0; i < n; i++) {
if(a[i] < b[j]) k++;
else j++;
}
cout << k << endl;
return0;
}。
以下哪些使用的是贪心算法

以下哪些使用的是贪心算法贪心算法是一种基于局部最优解构建整体最优解的策略。
下面是一些常见的使用了贪心算法的场景和问题:1.零钱找零问题:给定一定面额的硬币和一个要找零的金额,求最少需要多少硬币来找零。
贪心算法的思想是每次都找零面额最大的硬币,直到找完为止。
2.区间覆盖问题:给定一系列闭区间,找出最少的区间来覆盖整个区间。
贪心算法的思想是每次选择能够覆盖最远的区间。
3.最大子数组和问题:给定一个整数数组,找到一个具有最大和的连续子数组。
贪心算法的思想是每次选择当前元素或者将当前元素加入到已经选择的子数组中,以使子数组的和最大化。
4.会议安排问题:给定一系列会议的开始时间和结束时间,安排会议的最大数量,使得任意两个会议的时间不重叠。
贪心算法的思想是按照结束时间排序,每次选择结束时间最早的会议,然后剔除与该会议时间重叠的其他会议。
5.跳跃游戏问题:给定一个非负整数数组,每个元素表示在该位置的最大跳跃长度。
判断是否能够到达最后一个位置。
贪心算法的思想是从第一个位置开始,每次选择能够跳跃最远的位置进行跳跃。
6.路径规划问题:给定一个地图和起点终点,找到最短路径。
贪心算法的思想是根据当前位置选择下一个位置,直到到达终点。
7.任务调度问题:给定一系列任务的执行时间和任务间的冷却时间,求完成所有任务的最短时间。
贪心算法的思想是每次选择执行时间最长的任务,并在执行完该任务后等待冷却时间。
8.最小生成树问题:给定一个带权无向图,找到一个包含所有节点的最小生成子图。
贪心算法的思想是每次选择权值最小的边,并将其加入到最小生成树中。
9.背包问题:给定一系列物品和背包的容量,求能够装入背包的物品的最大总价值。
贪心算法的思想是每次选择单位重量价值最高的物品,直到背包装满或物品为空。
10.哈夫曼编码问题:给定一系列字符和对应的出现次数,构建一种编码方式使得编码长度最短。
贪心算法的思想是每次选择出现次数最少的两个字符进行编码。
以上只是一部分使用了贪心算法的问题,贪心算法在解决一些优化问题时往往能够得到近似最优解,但并不保证一定能得到全局最优解。
可用贪心算法解决的几个基本问题

可用贪心算法解决的几个基本问题关键:看问题有没有贪心选择性质和最优子结构性质。
有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解。
构造贪心算法后,需要一定的证明来确定它的正确性。
常用证明方法:反证法、调整法。
几个基本问题:1. 活动安排问题。
设有n个活动的集合e={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动i都有一个要求使用该资源的起始时间si和一个结束时间f i,且s i<f i。
如果选择了活动i,则它在区间[s i,f i]内占用资源。
若区间[s i,f i]与区间[s j,f j]不相交,则称活动i 与活动j是相容的。
也就是说,当s j≥fi或s i≥f j时,活动i与活动j相容。
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
解决方法:先选择结束时间最早的那一个活动,然后往后依次查找结束时间最近的不冲突的活动加入。
2. 可以解决背包问题,不能解决0-1背包问题。
0-1背包问题:给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。
不能将物品i装入背包多次,也不能只装入部分的物品i。
背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
解决方法:求每个物品的价值重量比,即价值/重量。
然后添加价值重量比最大的物品,添加结束如果未达到重量上限,再添加价值重量比次大的。
3. 最优装载问题有一批集装箱要装上一艘载重量为c的轮船。
其中集装箱i的重量为Wi。
最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
解决方法:每次装重量最轻者。
4. 哈夫曼编码给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码。
nyoj14会场安排问题(贪心专题)java

nyoj14会场安排问题(贪⼼专题)java会场安排问题时间限制:3000 ms | 内存限制:65535 KB难度:4描述学校的⼩礼堂每天都会有许多活动,有时间这些活动的计划时间会发⽣冲突,需要选择出⼀些活动进⾏举办。
⼩刘的⼯作就是安排学校⼩礼堂的活动,每个时间最多安排⼀个活动。
现在⼩刘有⼀些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输⼊第⼀⾏是⼀个整型数m(m<100)表⽰共有m组测试数据。
每组测试数据的第⼀⾏是⼀个整数n(1<n<10000)表⽰该测试数据共有n个活动。
随后的n⾏,每⾏有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表⽰第i个活动的起始与结束时间(Bi<=Ei)输出对于每⼀组输⼊,输出最多能够安排的活动数量。
每组的输出占⼀⾏样例输⼊221 1010 1131 1010 1111 20样例输出12提⽰注意:如果上⼀个活动在t时间结束,下⼀个活动最早应该在t+1时间开始来源import parator;import java.util.Iterator;import java.util.Scanner;import java.util.Set;import java.util.TreeSet;public class Coder001 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int T =sc.nextInt();while(T-->0){int n=sc.nextInt();Set<F> ts=new TreeSet<F>(new SORT());// F f[] =new F[n];for(int i=0; i<n; i++){int a=sc.nextInt();int b=sc.nextInt();F f =new F(a,b);ts.add(f);}F ff[] = new F[n];Iterator<F> it=ts.iterator();int e=-1;while(it.hasNext()){ff[++e]=it.next();}int count=1;int nn=ff[0].b;int mm;for(int i=0;i<n;i++){mm=ff[i].a;if(nn<mm){nn=ff[i].b;count++;}}System.out.println(count);}}}class SORT implements Comparator<F>{ @Overridepublic int compare(F o1, F o2) {if(o1.b==o2.b)return -1;return (o1.b-o2.b);}}class F{int a,b;F(int a,int b){this.a=a;this.b=b;}F(){}}View Code。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
cout<<m[j].num<<" "<<m[j].st<<" "<<m[j].et<<endl;
}
cout<<"共需要"<<select(m,n)<<"个会场"<<endl;
return 0;
}
for(int j=i+1;j<n;j++)
{
if(b[j].st>=b[a].et&&b[j].mark!=1)
{
b[j].mark=1;
a=j;
cout<<b[j].num<<" "<<b[j].st<<" "<<b[j].et<<endl;
{
min = a[j].et;
index = j;
}
}
temp = a[i];
}
}
}
}
return t;
}
int main()
{
int n;
cout<<"请输入需要召开多少场会议:"<<endl;
cin>>n;
meeting *m=new meeting[n];
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"场会议的编号、开始时间、结束时间和标记:"<<endl;
cin>>m[i].num>>m[i].st>>m[i].et>>m[i].mark;
}
sort(m, n);
cout<<"按照会议结束时间排序后的会议序列为:"<<endl;
a[i] = a[index];
a[index]= temp;
}
}
//贪心算法安排会议
int select(meeting b[],int n)
{
int t=0;
int a=0;
for(int i=0;i<n;i++)
{
if(b[i].mark==0)
{
b[i].mark=1;
a=i;
cout<<"第"<<++t<<"会场召开的会议为:"<<endl;
cout<<b[i].num<<" "<<b[i].st<<" "<<b[i].et<<endl;
#include<iostream>
using namespace std;
struct meeting
{
int num;
int st;
int et;
int mark;
};
//对会议按照结束时间进行排序
void sort(meeting a[],int n)
{
for(int i=0; i<n; i++)
{
int min = a[i].et;
meeting temp;
int index = i;
for(int j=i+1;j<n;j++)
ห้องสมุดไป่ตู้{
if(a[j].et < min)