贪心算法

实验内容:(场景:春节看剧)

寒假就要开始了,小伙伴们又能开始快乐的玩耍了(前提是考试不挂科!)。小哈作为一个大龄剩女,春节回家只能看电视,因为家里没有装宽带,电视节目也还算丰富多彩,各种剧集轮番上演。

小哈已经事前了解了电视节目的转播时间表,你能帮她合理安排吗?(目标是能猫在家里看尽量多的完整节目,以躲避各种聚会场合下亲朋好友的热心询问)

输入
程序启动后,依次输入信息如下:

1、第一行,输入1个整数n(0<n<=100),表示喜欢看的节目的总数

2、第二行开始(有n行),每行输入2个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。

输出
程序依次output的信息如下:

1、第一行,输出1个整数,表示能完整看到的电视节目的个数

输入样例 1

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
输出样例 1

5
输入样例 2

10
0 3
1 4
5 7
3 8
13 19
7 8
6 9
5 10
2 14
4 9
输出样例 2

4
提示

思路:贪心算法实现

把数据按节目结束时间从大到小进行排序(排序的目的是使取的结束时间都比剩下的结束时间要早这样才能看更多的节目)

对应的开始时间也进行了排序

从第一个结束时间开始,寻找下一个比这个时间晚的开始时间,如果找到了,节目数就加1(初始的节目数为1)
代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;
const int maxsize = 100;
typedef struct gra *graph;
struct gra {
	int x, y;
};
gra g[maxsize];
int n;
void quiksort(int s, int e) {
	if (s > e) {
		return;
	}
	gra p;
	int left = s, right = e;
	while (left != right) {
		while (g[right].y >= g[s].y && left < right) {
			right--;
		}
		while (g[left].y <= g[s].y && left < right) {
			left++;
		}
		if (left < right) {
			p = g[left];
			g[left] = g[right];
			g[right] = p;
		}
	}
	p = g[s];
	g[s] = g[right];
	g[right] = p;
	quiksort(s, right - 1);
	quiksort(right + 1, e);
	return;
}
int div() {
	int p = g[1].y;
	int count = 1;
	for (int i = 2; i <= n; i++) {
		if (g[i].x >= p) {
			count++;
			p = g[i].y;
		}
	}
	return count;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> g[i].x >> g[i].y;
	}
	quiksort(1, n);
	cout << div() << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值