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 <= ...
随机推荐
- nodejs实现简单爬虫
nodejs结合cheerio实现简单爬虫 let cheerio = require("cheerio"), fs = require("fs"), util ...
- 【MySQL高可用架构设计】(一)-- mysql复制功能介绍
一. 介绍 Mysql的复制功能是构建基于SQL数据库的大规模高性能应用的基础,主要用于分担主数据库的读负载,同时也为高可用.灾难恢复.备份等工作提供了更多的选择. 二.为什么要使用mysql复制功能 ...
- JAVAWEB复习笔记-day02
1.CSS样式优先级 优先级:由上到下,由外到内.优先级越来越高 2.css选择器 html标签选择器 class选择器(.) id选择器(#) 3.优先级 style属性>id选择器>c ...
- JS高阶---原型链
[大纲] [主体] 1.创建函数 注意:Object内置原生对象原来就有 2.添加实例方法 3.根据构造函数创建实例对象 原型链寻找 1.本身有在本身找 2.本身没有往摸着隐式原型链往里找 或者再上层 ...
- 201777010217-金云馨《面向对象程序设计(java)》第十三周学习
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 海量数据MySQL项目实战
主要内容包含 MySQL 典型数据库架构介绍.MySQL 主流数据库架构对比等理论性知识,然后从“订单.用户”两个项目实战,抛砖引玉,介绍亿级互联网业务数据库项目如何设计. MySQL 典型数据库架构 ...
- (day47)jQuery
目录 一.初识jQuery (一)jQuery介绍 (二)版本介绍 (三)jQuery对象 (四)相关网站 (五)基础语法 二.查找标签 (一)基本选择器 (1)id选择器 (2)标签选择器 (3)c ...
- 洛谷 P1156 垃圾陷阱 题解
题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...
- [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项之二
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- [LeetCode] 40. Combination Sum II 组合之和之二
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...