问题描述:

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

问题解答:

<1>、用贪心选择策略解会场安排问题。

贪心算法重要的两个性质:贪心选择性质和最优子结构性质。

1、 问题的贪心选择性质

证明:首先将会场安排问题数学化,设有n个活动的集合 e= { 1 ,2 ,…,n },每个活动 i 都有一个要求使用该会场的起始时问si 和一个结束时问fi 。即k是所需最少会场的个数。设活动已排序,( a1 , a2 , … ,ak )是所需要的k个已安排了活动的会场。①当k = 1时,也就是所有的活动在一个会场里相容,a1 是满足贪心选择性质的最优解;②当k>= 2时,取b1=a1,bk=ak (即bk是安排了m个活动的一个会场,(n-m)个活动都安排在b1 到bk-1个会场里)。就是(n-m)个活动安排需要(k -1)个会场。则(b1,b2 ,…,bk-1 )是(n - m)个活动可行解。另一方面,由{( a1 ,a2,…,ak)-ak}=(b1,b2,…,bk-1)知,(b1,b2,…,bk-1)也是满足贪心选择性质的最优解,所以,会场安排问题具有贪心选择性质。

2、 问题的最优子结构性质

证明:( a1,a2, …,ak )是n个活动的集合e= {1,2 ,…,n }所需会场的最优解。设a1中安排了m个相容的活动,那么也就是说(n-m)个活动完全安排需要k-1个会场。假设(n - m)个活动安排只需要k-2个会场或则更少的会场。也就是说n个活动安排只需要k-1个会场或者更少的会场就可以安排完,则前后出现矛盾。一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

<2>、算法实现思路:

1)、首先定义一个时间类Node,有两个data,flag属性,其中data是时间值,flag是判断活动开始还是结束。

2)、对所有的时间对象按.data排序到一个数组中,其中选择归并排序方法进行排序。

3)、该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。依次取出该数组的数据,判断其属性flag,若是一个开始时间,则Count++,若是结束时间Count--,其中最大的Count值就是要求的最少的会场数。

<3>、算法程序:

#include<iostream>
#include<fstream>
using namespace std;//活动的时间类
class Node
{
public:int data;//时间值bool flag;//判断是开始还是结束,0表示开始,1表示结束bool operator<(Node &secondRational);//按时间值比较两个对象的大小
};//比较类中时间值的大小
bool Node::operator<(Node &secondRational)
{if((this->data-secondRational.data)<0)return true;elsereturn false;
}//复制数组函数
template<typename T>
void arraycopy(T source[],int sourceStartIndex,T target[],int targetStartIndex,int length);
//合并数组函数
template<typename T>
void merge(T list1[],int list1Size,T list2[],int list2Size,T temp[]);
//归并排序函数
template<typename T>
void mergeSort(T list[],int arraySize)
{if(arraySize>1){//复制排序前半部分数组T *firstHalf=new T[arraySize/2];arraycopy(list,0,firstHalf,0,arraySize/2);mergeSort(firstHalf,arraySize/2);//复制排序后半部分数组int secondHalfLength=arraySize-arraySize/2;T *secondHalf=new T[secondHalfLength];arraycopy(list,arraySize/2,secondHalf,0,secondHalfLength);mergeSort(secondHalf,secondHalfLength);//合并复制两部分数组T *temp=new T[arraySize];merge(firstHalf,arraySize/2,secondHalf,secondHalfLength,temp);arraycopy(temp,0,list,0,arraySize);delete []temp;delete []firstHalf;delete []secondHalf;}
}//将两个数组按大小顺序合并入一个数组中
template<typename T>
void merge(T list1[],int list1Size,T list2[],int list2Size,T temp[])
{int current1=0;int current2=0;int current3=0;while(current1<list1Size&¤t2<list2Size){if(list1[current1]<list2[current2])temp[current3++]=list1[current1++];elsetemp[current3++]=list2[current2++];}while(current1<list1Size)temp[current3++]=list1[current1++];while(current2<list2Size)temp[current3++]=list2[current2++];
}//将一个数组复制到另一个数组中
template<typename T>
void arraycopy(T source[],int sourceStartIndex,T target[],int targetStartIndex,int length)
{for(int i=0;i<length;i++){target[i+targetStartIndex]=source[i+sourceStartIndex];}
}//最少会场数函数
int Greedyplan(Node f[],int n)
{int Count=0;int maxCount=0;/*遍历活动时间,若此时间为开始时间,则Count+1,为结束时间,则Count-1统计得出最大的Count值,并将Count值赋给maxCount,此maxCount值就为最少的会场数*/for(int i=0;i<n;i++){if(f[i].flag==0)//若此时间为开始时间Count+1{Count++;if(Count>maxCount)//记录次循环中最大的Count值{maxCount=Count;}}else//若为结束时间Count-1{Count--;}}return maxCount;
}int main()
{//读出输入文件中的数据fstream fin;fin.open("input.txt",ios::in);if(fin.fail()){cout<<"File does not exist!"<<endl;cout<<"Exit program"<<endl;return 0;}int n;fin>>n;//建立两个Node类型的数组,用于存放开始时间和结束时间Node *a=new Node[n];Node *b=new Node[n];for(int i=0;i<n;i++){fin>>a[i].data;fin>>b[i].data;}//将开始时间表示为0for(int j=0;j<n;j++){a[j].flag=0;    }//将结束时间表示为1for(int k=0;k<n;k++){b[k].flag=1;    }//再建立一个Node类型的数组,将前两个数组中的数据复制到此数组中Node *c=new Node[2*n];arraycopy(a,0,c,0,n);arraycopy(b,0,c,n,n);//将数组c按时间值大小排序,此排序为稳定的归并排序mergeSort(c,2*n);//调用最少会场数函数int mm=Greedyplan(c,2*n);//控制台输出cout<<"最少会场数为:"<<mm<<endl;//将结果数据写入到输出文件fstream fout;fout.open("output.txt",ios::out);fout<<mm;fin.close();fout.close();system("pause");return 0;
}

会场安排问题贪心算法相关推荐

  1. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

  2. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...

  3. 活动安排问题(贪心算法)

    问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺 ...

  4. 最早结束时间安排活动--贪心算法证明

    活动安排的最优解,一般是贪心算法的思路求取.每一次选择 相对于当前时间 最早结束的活动,得到的子序列是活动的一个最优安排,即在一段时间内安排的活动数最多. 设定命题 贪心算法执行到第k步,选择了k项活 ...

  5. 活动安排问题--贪心算法

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  6. 7-37 会场安排问题——贪心

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

  7. 会场安排问题(C语言实现)

    会场安排问题 贪心算法.贪心策略 题目描述 只有一个会场,输入总共的场数与开始时间和结束时间,输出最多能安排的场数. 输入: 5 1 23 12 24 25 35 36 80 38 50 输出: 3 ...

  8. 【无标题】贪心算法-MATLAB实现

    贪心算法-Matlab实现 贪心算法的基本原理 贪心算法的性质 例题 找零钱问题 空瓶换酒问题 活动安排问题 贪心算法的局限性 贪心算法的基本原理 贪心算法是使所做的选择看起来都是当前最佳的,期望通过 ...

  9. 贪心算法--会场安排问题

    会场用来安排活动,每个活动有一个开始时间和一个结束时间,在某个活动的开始时间到结束时间这段范围内,其他活动不能再被安排,求最多能安排多少场活动. #include<stdio.h> #in ...

最新文章

  1. HDU1527(博弈论)
  2. 陶大程:判断人工智能是否可信的“四把尺子”
  3. 开源BTS产品中存在多处漏洞,攻击者或可劫持手机通讯基站
  4. (操作系统)实验二 作业调度
  5. CSS进阶(7)—— 内联元素的掌管者line-height和vertical-align(上)
  6. War包与配置文件分离
  7. C#托管代码与C++非托管代码互相调用二(C++调用C#代码)
  8. AI:神经网络调参(数据、层数、batch大小,学习率+激活函数+正则化+分类/回归)并进行结果可视化
  9. python try 异常处理 史上最全
  10. C语言 | 结构体指针
  11. python预测股票价格tushare_用tushare对股票进行简单分析
  12. 我看中国软件---人才篇
  13. 计算机初级考试题库网络管理,计算机基础考试题库(含答案)
  14. LeetCode--49. 字母异位词分组(哈希表)
  15. 3.1EDA和数据描述: 探索性数据分析
  16. [Http权威指南]1.Http概况
  17. 数学建模常见算法:插值算法
  18. iOS手机模拟器配置
  19. 打印机共享无法访问该计算机,共享打印机拒绝访问怎么办详细解决方案
  20. 花呗部分用户已接入央行征信系统,快看你被选中了没?

热门文章

  1. 回归,不忘初心,再出发!
  2. 内置 100V/5A MOS 宽输入电压降压型 DC-DC OC5800L
  3. 一款尝试“去区块链”化的UGC+爬塔类链游
  4. PermissionError
  5. Intel争夺台积电5nm工艺,AMD疑似被迫出走三星
  6. jenkins自定义邮件发送Editable
  7. ESD防静电保护管PESDHC2FD4V5BH原装芯导Prisemi,DFN1006-2反向关断电压4.5V,箝位电压5.8V,PESDHC2FD4V5BH双向静电保护
  8. Unity 音效管理器编辑窗口的创建和Manager的创建
  9. 优盘文件误删恢复与隐藏
  10. ESP8266 中断(Interrupts)和计时器(Timers)功能介绍