BG10

探讨了在多个活动申请使用同一场地时,如何通过贪心算法选择最多数量的不冲突活动。介绍了按活动结束时间排序的贪心策略,并提供了算法实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 问题
    相容问题,解析时给出其他几种贪心策略(如按开始时间从小到大、每个活动时间的占用时间等),并给出这些贪心策略无法实现最优的反例。
    问题描述
    有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。

  2. 解析
    [问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
    建模:设S={1,2,…,n}为活动的集合,si和fi分别为活动i的开始和截止时间,i=1,2,…,n
    定义:活动i和j相容 si>=fi或sj>=fi,i≠j
    求S最大的两两相容的活动子集A。
    按开始时间从小到大:
    在这里插入图片描述

  3. 设计在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct huodong{
	int ss;
	int ee;
	int time;
}A[130];
void sort(huodong A[],int n) {
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 1; j < n - i; j++)
		{
			if (A[j - 1].end > A[j].end)
			{
				int temp = A[j - 1].end;
				A[j - 1].end = A[j].end;
				A[j].end = temp;
				temp = A[j - 1].start;
				A[j - 1].start = A[j].start;
				A[j].start = temp;
				temp = A[j - 1].time;
				A[j - 1].time = A[j].time;
				A[j].time = temp;
			}
		}
	}
}
int f(huodong A[],int n) {
	int k = 1;
	int lastend = A[0].end;
	for (int i = 1; i < n; i++)
	{
		if (A[i].start > lastend)
		{
			k++;
			lastend = A[i].end;
		}
	}
	return k;
}
int main(){
	int l,pp;
	printf("请输入活动数目:");
	scanf("%d", &l);
	printf("请输入输入活动开始和结束时间:");
	for(pp = 0; pp < l; pp++){
		scanf("%d", &A[pp].ss);
		scanf("%d", &A[pp].ee);
		A[pp].time = A[pp].ee - A[pp].ss;
	}
	sort(A,l);
	
	printf("%d", f(A, l));
}
  1. 分析
    时间复杂度:T(n)=O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值