C++贪心算法实现活动安排问题
问题描述:
设有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相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
细节须知:
暂无。
算法原理:
a.对活动进行排序
将各活动的起始时间和结束时间存储于数组中并按结束时间进行非减序排列,如果所给出的活动未按此序排列,可以进行重排。
b.依次向后寻找相容的且结束时间最早活动
算法开始选择活动1,并将j初始化为1。然后依次检查活动i是否与当前已选择的所有活动相容,若相容则将活动i加入已选择活动的集合A中;否则,不选择活动i,而继续检查下一活动与集合A中活动的相容性。由于fj总是当前集合A中所有活动的最大结束时间,故活动i与当前集合A中所有活动相容的充分且必要的条件是其开始时间si不早于最近加入集合A的活动j的结束时间fi。若活动i与之相容,则i成为最近加入集合A中的活动,并取代活动j的位置。由于输入的活动以其完成时间的非减序排列,所以算法每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
#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 = ;
solution[] = ;
int i,j = ,counter = ;
for(i = ;i < m ;i++)
{
if(activity[i].start >=activity[j].finish)
{
solution[i] = ;
j = i;
counter++;
}
else
solution[i] = ;
}
cout << "The amount of activities is:"<<counter<<endl;
cout << "The solution is:";
for(i = ;i < m ;i++)
{
if (solution[i] == )
{
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 -;
}
fout.setf(ios_base::fixed,ios_base::floatfield); //防止输出的数字使用科学计数法
for (j = ;j < t;j++)
{
cout << "——————————————————The "<< j + << "th test —————————————————"<<endl;
m = + rand()%;
fout<<m<<",";
int solution[m];
activity activity[m];
for( i = ;i < m;i++)
{
activity[i].no = i+;
activity[i].start = + rand()%;
while()
{
activity[i].finish = + rand()%;
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 ;
}
程序设计思路:
① 数据结构:结构体中存储活动序号、活动开始时间、活动结束时间;
② 利用C++自带的sort函数对结构体按照活动结束时间进行升序排列;
③ 算法开始选择活动1,并将j初始化为1。然后依次检查活动i是否与当前已选择的所有活动相容,若相容则将活动i加入已选择活动的集合A中;否则,不选择活动i,而继续检查下一活动与集合A中活动的相容性。由于fj总是当前集合A中所有活动的最大结束时间,故活动i与当前集合A中所有活动相容的充分且必要的条件是其开始时间si不早于最近加入集合A的活动j的结束时间fi。若活动i与之相容,则i成为最近加入集合A中的活动,并取代活动j的位置。由于输入的活动以其完成时间的非减序排列,所以算法每次总是选择具有最早完成时间的相容活动加入集合A中。
时间复杂性分析:
首先,需要对输入的事件按照结束时间进行非减序排列,需要用O(nlogn)的时间。其次,算法greedySelector的效率极高,当输入的活动已按结束时间的非减序排列,算法只需θ(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。
生成的数据可导入EXCEL中进行数据分析生成分析图表。
C++贪心算法实现活动安排问题的更多相关文章
- [C++] 贪心算法之活动安排、背包问题
一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考 ...
- 贪心算法求解活动安排<算法分析>
一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤 ...
- 51nod贪心算法入门-----活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...
- 51nod贪心算法入门-----活动安排问题2
题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. #inclu ...
- 雷达覆盖,贪心,类似活动安排(POJ1328)
题目链接:http://poj.org/problem?id=1328 解题报告: 1.按照头结点排序. #include <cstdio> #include <cmath> ...
- 忙碌的Nova君 (活动安排问题、贪心算法)
题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
- hdu2037今年暑假不AC(贪心,活动安排问题)
今年暑假不AC Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- A - 活动安排问题(贪心)
A - 活动安排问题 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input第一行一个正整数n (n <= ...
随机推荐
- JWT 学习资料
学习资料 网址 官方网站 https://jwt.io/ debugger https://jwt.io/#debugger 相关的类库 https://jwt.io/#libraries (java ...
- python SSL 错误
python 使用pip 安装模块是提示SSL错误 出现该问题的原因由于系统的openssl是1.0.1的版本,对于python3.7太老了,需要更新为openssl1.0.2或者libressl2. ...
- Netty的常用API(二)
在使用Netty之前先介绍下Netty的常用API,对其有一个大概的了解. 一.EventLoop和EventLoopGroup EventLoop如同它的名字,它是一个无限循环(Loop),在循环中 ...
- AndroidStdio模拟器打不开报错 Guest isn't online after 7 seconds
开了好几次模拟器,始终运行不出来原来的一个项目.报错如下: 解决方案: 经过百度,可能是Android Studio 3.0升级到3.0.1,启动原来建好的模拟器废掉了. 找到你软件中的 建议选择屏幕 ...
- 批处理教程之cls、pause命令
cls 命令 清除屏幕.执行该命令后,屏幕上的所有信息都被清除,光标重新定位至屏幕左上角. REM 和 :: REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显. 其次 ...
- icon发展史速览
icon 发展史 img 多张图片占用多个请求,想办法减少请求,合并图片,image sprite background-position /* 使用background-position来定位图标 ...
- javaSript 处理电脑和浏览器pc端缩放对页面的影响
由于用户的个人习惯或其他原因,可能会调整到电脑上的缩放比例或者浏览器的缩放比例,如果访问页面会看起来比较不好看, 电脑上的缩放: 浏览器上的缩放: 解决方法: function detectZoom( ...
- [原创]A/B测试系统调研思维导图
[原创]A/B测试系统调研思维导图
- jenkins 更新插件使用代理
方法一: 管理插件页面配置如下: 这个 URL 改成http://mirror.xmission.com/jenkins/updates/update-center.json 或https://mir ...
- centos 安装 oracle11r2
因为要测试spark链接oracle,所以需要再服务器装oracle 1.下载oracle, 如果自己下载需要注册,比较麻烦,可以直接用如下命令下载 因为zip比较大,建议nohup 后台下载 noh ...