// 活动选择问题(活动安排问题)(最大数目活动选择问题).cpp : Defines the entry point for the console application.
//贪心算法
#include "stdafx.h"
#include<iostream>
#define N 100
using namespace std;
struct Activity
{
int number; //活动编号
int begin; //活动开始时间
int end; //活动结束时间
bool flag; //此活动是否被选择
};
//对于活动集,按照结束时间递增排序,使用快速排序
void fast_sort(Activity *act,int f,int t)
{
if(f<t)
{
int i = f-1,j = f;
Activity a = act[t];
while(j<t)
{
if(act[j].end<=a.end)
{
i++;
Activity temp1 = act[i];
act[i] = act[j];
act[j] = temp1;
}
j++;
}
Activity temp2 = act[t];
act[t] = act[i+1];
act[i+1] = temp2;
fast_sort(act,f,i);
fast_sort(act,i+2,t);
}
}
//选择最大活动数目
void select_activity(Activity *act,int n)
{
int i = 0;
act[0].flag = true;
Activity a = act[0];
for(i=1;i<n;i++)
{
if(act[i].begin>=a.end)
{
act[i].flag = true;
a = act[i];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int cases;
Activity act[N];
cout<<"请输入案例的个数:"<<endl;
cin>>cases;
while(cases--)
{
int n;
cout<<"请输入活动的数目:"<<endl;
cin>>n;
int i;
for(i=0;i<n;i++)
{
act[i].number = i+1;
act[i].flag = false;
cout<<"活动"<<i+1<<"开始时间:";
cin>>act[i].begin;
cout<<"活动"<<i+1<<"结束时间:";
cin>>act[i].end;
}
//快速排序
fast_sort(act,0,n-1);
//选择最大数目活动集
select_activity(act,n);
int sum = 0;
cout<<"最终选择的活动集合为:"<<endl;
cout<<"< ";
for(i=0;i<n;i++)
if(act[i].flag)
{
cout<<act[i].number<<" ";
sum ++;
}
cout<<">"<<endl;
cout<<"最大活动集合的数目为:"<<sum<<endl;
}
system("pause");
return 0;
}
----------------------------------------------程序测试----------------------------------------------------
请输入案例的个数:
1
请输入活动的数目:
11
活动1开始时间:1
活动1结束时间:4
活动2开始时间:3
活动2结束时间:5
活动3开始时间:0
活动3结束时间:6
活动4开始时间:5
活动4结束时间:7
活动5开始时间:3
活动5结束时间:8
活动6开始时间:5
活动6结束时间:9
活动7开始时间:6
活动7结束时间:10
活动8开始时间:8
活动8结束时间:11
活动9开始时间:8
活动9结束时间:12
活动10开始时间:2
活动10结束时间:13
活动11开始时间:12
活动11结束时间:14
最终选择的活动集合为:
<1 4 8 11 >
最大活动集合的数目为:4
请按任意键继续. . .
分享到:
相关推荐
在这个"贪心算法解决程序存储于磁带问题源代码c++实现"的问题中,我们面对的是一个资源分配的问题,具体来说,是如何在有限的磁带空间内存储尽可能多的程序。 首先,我们要理解这个问题的基本设定。假设我们有若干...
根据给定的文件内容,本节知识点涉及到贪心算法在具体问题中的应用,以下是知识点的详细说明: 一、贪心算法的概念 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的...
### 贪心算法在最少硬币找零问题中的应用 #### 一、问题背景及定义 在实际生活中,我们经常遇到需要...当然,在某些特殊情况下面值的选择可能会影响最终结果,但总体上,贪心算法仍然是解决这类问题的一个优秀选择。
首先定义什么是贪心算法以及其核心理念—即每次选择当前状态下最佳的解决方案。文中还阐述了贪心算法在实践中通过自上而下的方式进行逐步解决的方法论。接着通过具体的找零钱和删除指定数目数字以获得较大新数值这两...
标题中的"C++ 搬水果贪心算法实现代码"指的是使用C++编程语言来实现一种基于贪心策略的算法,解决“搬水果”的问题。这个问题描述如下:在果园里,小明将水果按种类分成多堆,每堆水果的重量相等且代表水果的数目。...
在找零钱问题中,可以使用贪心算法来选择最大的硬币面值,以尽量减少硬币的数量。 例如,如果需要找零 33 美分,可以先选择 25 美分的硬币,然后选择 5 美分的硬币,最后选择 3 个 1 美分的硬币。这样可以用最少的...
这个问题是关于C++实现的一种算法...总之,这个C++代码展示了如何解决堆石子游戏中的最大总费用和最小总费用问题,通过排序和贪心策略实现了有效的解决方案。理解并掌握这种算法有助于提升在组合优化问题上的解决能力。
贪心算法是指在每一步选择中都采取在当前状态下最优的选择,以期望达到全局最优的结果。该算法主要用于解决一些组合优化问题。在本题中,我们可以使用贪心算法来解决问题。具体来说,我们可以维护两个栈,一个栈用于...
- **最少找硬币问题(贪心策略-深搜实现)**:解决找零问题,即如何使用最少数量的硬币找零。 - **棋盘分割**:将棋盘分割成若干个特定形状的问题。 - **汉诺塔**:解决汉诺塔问题,即将圆盘从一根柱子移动到另一根...
- DINIC算法是一种高效的求解最大流问题的算法,本节介绍了其具体实现方式。 - **HLPP最大流O(V^3)** - HLPP(Highest Label Preflow-Push)算法也是求解最大流问题的一种有效方法。 - **最小费用流O(V*E*F)** ...
SCCA算法是基于覆盖的概念设计的,它的主要思想是逐步构建解决方案,每次选择一个能够最大化当前未覆盖节点数目的城市进行访问。这个过程不断迭代,直到所有城市都被覆盖。与传统的贪心算法或遗传算法相比,SCCA通常...
Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次选择与当前树连接且权重最小的边,直到覆盖所有顶点。该算法适合处理稠密图,即边的数目接近于顶点数的平方。在C语言实现时,通常会用到优先队列...
在算法部分,除了基本的排序和搜索算法,还需要掌握动态规划、回溯法、贪心算法、分治法、图算法(如Dijkstra、Floyd-Warshall等)以及模拟等。 总的来说,参与ACM竞赛不仅需要深入理解和熟练运用各种算法和数据...
- **贪心算法的应用**: - Kruskal算法用于寻找无向图的最小生成树,确实使用了贪心策略。 - Dijkstra算法用于计算图中两点之间的最短路径,同样基于贪心思想。 - Tarjan算法用于计算无向图的点双连通分量,它并...
### Dijkstra算法详解 #### 简介 Dijkstra算法是一种经典的单源最短路径算法,...虽然Dijkstra算法在处理大规模图时可能会因为较高的时间复杂度而显得效率较低,但在多数情况下仍然是求解最短路径问题的理想选择之一。
- **问题描述**:实现快速排序算法对一组数据进行排序。 - **解题思路**: - 选择一个基准值(pivot),通常选择第一个元素或最后一个元素。 - 将小于基准值的元素放在基准值的左边,大于基准值的元素放在右边。 ...