实验内容:(场景:春节看剧)
寒假就要开始了,小伙伴们又能开始快乐的玩耍了(前提是考试不挂科!)。小哈作为一个大龄剩女,春节回家只能看电视,因为家里没有装宽带,电视节目也还算丰富多彩,各种剧集轮番上演。
小哈已经事前了解了电视节目的转播时间表,你能帮她合理安排吗?(目标是能猫在家里看尽量多的完整节目,以躲避各种聚会场合下亲朋好友的热心询问)
输入
程序启动后,依次输入信息如下:
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;
}