C++贪心算法实现活动安排问题

_(:з」∠)_

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <ctime>
 4 #include <windows.h>
 5 #include <algorithm>
 6 #include <fstream>
 7 using namespace std;
 8 struct activity
 9 {
10     int no;
11     int start;
12     int finish;
13 };
14 bool cmp(const activity &x, const activity &y)
15 {
16     return x.finish<y.finish;//从小到大排<,若要从大到小排则>
17 }
18 int greedySelector(int m,int solution[],struct activity activity[]){
19     int number = 1;
20     solution[0] = 1;
21     int i,j = 0,counter = 1;
22     for(i = 1;i < m ;i++)
23     {
24         if(activity[i].start >=activity[j].finish)
25         {
26             solution[i] = 1;
27             j = i;
28             counter++;
29         }
30         else
31             solution[i] = 0;
32     }
33     cout << "The amount of activities is:"<<counter<<endl;
34     cout << "The solution is:";
35     for(i = 0 ;i < m ;i++)
36     {
37        if (solution[i] == 1)
38        {
39             cout << activity[i].no <<" ";
40        }
41     }
42     return counter;
43 }
44 int main(void)
45 {
46     LARGE_INTEGER nFreq;
47     LARGE_INTEGER nBeginTime;
48     LARGE_INTEGER nEndTime;
49     ofstream fout;
50     srand((unsigned int)time(NULL));
51     int m,i,j,t;
52     double cost;
53     cout << "Please enter the number of times you want to run the program:";
54     cin >> t;
55     fout.open("activity.txt",ios::app);
56     if(!fout){
57         cerr<<"Can not open file ‘activity.txt‘ "<<endl;
58         return -1;
59     }
60     fout.setf(ios_base::fixed,ios_base::floatfield);       //防止输出的数字使用科学计数法
61     for (j = 0;j < t;j++)
62     {
63         cout << "——————————————————The "<< j + 1 << "th test —————————————————"<<endl;
64         m = 1 + rand()%100000;
65         fout<<m<<",";
66         int solution[m];
67         activity activity[m];
68         for( i = 0;i < m;i++)
69         {
70             activity[i].no = i+1;
71             activity[i].start = 1 + rand()%1000;
72             while(1)
73             {
74                 activity[i].finish = 1 + rand()%10000;
75                 if(activity[i].finish > activity[i].start) break;
76             }
77         }
78         QueryPerformanceFrequency(&nFreq);
79         QueryPerformanceCounter(&nBeginTime);
80         sort(activity,activity+m,cmp);
81         greedySelector(m,solution,activity);
82         QueryPerformanceCounter(&nEndTime);
83         cost=(double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;
84         fout << cost << endl;
85         cout << "\nThe running time is:" << cost << " s" << endl;
86     }
87     fout.close();
88     cout << endl << endl;
89     cout << "Success!" << endl;
90     return 0;
91 }

原文地址:https://www.cnblogs.com/Jesse-Cavendish/p/11791036.html

时间: 2024-11-06 23:11:01

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相容. 由于输入的活动以其完成时间的非减序排列,所以算法

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

51nod贪心算法入门-----活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 我们可以知道先安排最早结束的活动可以更多的安排活动.首先就是将所有的活动结束时间按先后顺序给排序:然后以结束时间为线索

51nod贪心算法入门-----活动安排问题2

题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. 1 #include<stdio.h> 2 #include<iostream> 3 #include<stdlib.h> 4 #include<queue> 5 using namespace std; 6 struct node 7 { 8 int start; 9 i

贪心算法之活动分配问题

贪心算法之活动分配问题 在此之前,我们还讨论过贪心算法的活动选择问题,活动选择问题里面的选择策略在这篇文章里面作为贪心选择策略用到.好吧,让我们进入主题. 问题描述 有一个活动集合S={a1,a2,a3,...an},每一个活动ai都有一个开始时间si和结束时间fi,那么活动ai占用的时间段为[si,fi).如果活动ai和aj的时间段没有交集重叠,那么这两个活动是兼容的,即满足si≤fj或者fi≥sj,[ai,aj]就是兼容的.现在我们需要为这些活动安排教室,保证活动之间各不冲突.请问怎么安排才

贪心算法解决会场安排问题

贪心算法解决会场安排问题. [问题描述] 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数.) [数据输入] 由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动. 接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间. [结束输出] 输出最少会场数. input.txt    

贪心算法求解活动选择问题

问题描述:  有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用.每个活动a都有一个开始时间和结束时间,且 0<= s < f .一旦被选择后,活动a就占据半开时间区间[s,f].如果[si,fi]和[sj,fj]互不重叠,则称两个ai,aj活动是兼容的.该问题就是要找出一个由互相兼容的活动组成的最大子集.假设输入的活动集合S已经按照结束时间的单调递增顺寻进行了排序. i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0

【贪心算法】舞蹈室安排

Description 新活有个舞蹈室,并且只有一个舞蹈室,假设申请时间以小时为单位,每天24个小时,每周就是168小时,我们规定申请时间从每周一的0点开始递增,比如申请时间区间为[1,24]就代表周一的0点到24点,时间区间[25,48]就代表周二的0点到24点,以此类推. 现在假定你是舞蹈室的管理人员,面对一批使用舞蹈室的申请,你希望舞蹈室能尽可能给更多人使用(也就是尽可能满足更多申请数量,请注意,这里要求的并不是舞蹈室被使用的时间最多,而是被批准的申请数量最多),请你写一个程序判断这批申请

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如