算法——实验三:贪心法_数据、数组、结构体、结构体数组传参

数组传参和结构体传参:
  1. 单个数据:
    按值传递,也可以地址传递
  2. 数组:
    function(a)有两种传递方法,一种是function(int a[]); 另一种是function(int *a)。这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值!
    C++中数组作为形参进行传递
    数组作为形参时,传递的是地址
  3. 结构体:
    按值传递,也可以地址传递
  4. 结构体数组:
    与数组一样,传递的是地址

结构体:
在这里插入图片描述

结构体元素交换

可以直接交换所有元素

贪心法

贪心法:
基本思想:总是做出在当前看来是最好的选择,期待通过局部最优解获得全局最优解
在这里插入图片描述

题目:活动安排问题

类似这种题还有个区间覆盖问题,就是说很多个区间,其中有些是相互覆盖着的,要求去除多余的区间,使剩下的区间占用长度最大,实际就是这个题,只是问法变换了而已!
在这里插入图片描述

#include <iostream>
// 贪心算法:要求尽可能多的活动,每次选择最早开始最早结束的,用时最少 
using namespace std;
struct active {
   	// 定义活动的结构体 
	int start;
	int finish;
	int mark;	// 作为此活动有无被执行的标志 /在此处赋初值会有警告 
};
// 选择排序排出最早结束的 
void finishSort(active num[], int N)
{
   
	int i,j;
	for (i=0; i<N-1; i++) {
   
		int min = i;
		for (j=i+1; j<N; j++) {
   
			if (num[j].finish < num[min].finish) {
   
				min = j;
			}
		}
		// 结构体元素交换 /
		active t = num[i];
		num[i] = num[min];
		num[min] = t;
	} 
}
// 活动安排 
void Select(active num[], int N)
{
   
	int time = num[0].finish;	// 时间指向第一个活动的结束
	num[0].mark = 1; 
	for (int i=1; i<N; i++) {
   	// 从第一个活动开始比较 
		if (num[i].start >= time) {
   	// 此时接着做下一个活动来得及 
			time = num[i].finish;	// 更新时间 
			num[i].mark = 1;	// 标记 
		}
	} 
} 
int main()
{
   
	active num[100];
//	// 输入
//	int N;
//	cout<<"输入活动个数:"<<endl;
//	cin>>N;
//	for (int i=0; i<N; i++) {
   
//		cout<<"第"<<i+1<<"个活动:"<<endl<<"起始时间:"<<endl;
//		cin>>num[i].start;
//		cout<<"结束时间:"<<endl;
//		cin>>num[i].finish;
//	} 
	// 默认输入
	int N = 11;
	int s[11] = {
   1,3,0,5,3,5,6,8,8,2,12};
	int f[11] = {
   4,5,6,7,8,9,10,11,12,13,14};
	for (int i=0; i<11; i++) {
   
		num[i].start = s[i];
		num[i].finish = f[i];
		num[i].mark = 0; 
	}
	// 输出
	for (int i=0; i<N; i++) {
   
		cout<<num[i].start<<" "<<num[i].finish<<" "<<num[i].mark<<endl;
	} 
	// 按照最早结束排序/// 
	finishSort(num, 11);
	// 输出
	for (int i=0; i<N; i++) {
   
		cout<<num[i].start<<" "<<num[i].finish<<" "<<num[i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值