【问题描述】
马上要期末考试了,本周六重庆交通大学电影院将是本学期最后一次放映电影。考虑到很多学生要看电影,为了满足这些学生的要求,电影院决定从凌晨0点开始放映,一直放映到午夜24点整(^-^,是不是很疯狂?!)。电影院有很多个放映厅,分别放映不同的电影,以供学生选择。电影院提前通知了每部电影的放映时间和所在放映厅。但是,学校要求周六那天电影院在指定的时间段某放映厅要放映一部政治宣传电影,而且要求每个学生党员都要观看。
小王很喜欢看电影。在电影院贴出放映电影名称和时间的那天他就去看通知了。幸运的是,这些电影小王都喜欢看,不幸的是有些电影时间上有冲突,更不幸的是,他是党员,必须在指定的时间观看指定的政治片。请帮帮小王安排时间,使得他能看到最多的电影。
【输入形式】
输入文件中包含多个测试数据。每个测试数据的第1行为一个正整数N(1<=N<=20),表示电影院周六那天放映的电影数(不包括政治片);然后是2行,第2行为N部电影各自的开始时间s,第3行为N部电影各自的结束时间t,0<=s<t<=24,s和t均为整数;如果这N部电影中某些电影时间有冲突,则表示这些电影是在不同放映厅放映的;第4行为两个整数m和n,表示学校指定政治片的开始时间和结束时间,0<=m<n<=24。N = 0表示输入结束。
【输出形式】
对输入文件中的每个测试数据,输出小王最多能观看到的电影数(不包括必须看的政治片,因为这本来不是小王所想看的)。
【样例输入】
8 0 1 4 7 9 10 13 12 7 4 9 13 15 13 19 15 5 10 0
【样例输出】
3
#include <stdio.h> #include <iostream> #include <stdlib.h> #include <algorithm> using namespace std; struct film{ int start; int end; }set[30]; bool used[30] = { 0 };//记录哪些电影可以看,哪些不能看 int num; int s; int e; int sum = 0; int cmp(const void *a, const void *b) { return ((film *)a)->end - ((film *)b)->end; } void hoge() { int k = 99; int i = 2; for (i = 1; i <= num; i++) { if (used[i] == 1) { k = set[i].end; sum++; break; } } i++; for (; i <= num; i++) { if (used[i] == 1 && set[i].start >= k) { k = set[i].end; sum++; } } } void Rightful() { int i; for (i = 1; i <= num; i++) { if (s<set[i].end&&e>set[i].start) used[i] = 0; } } void pri() { int i; for (i = 1; i <= num; i++) { if (used[i] == 1) printf("%d %d \n", set[i].start, set[i].end); } } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); while (cin >> num) { sum = 0; if (num == 0) break; int i; for (i = 1; i <= num; i++) { cin >> set[i].start; used[i] = 1; } for (i = 1; i <= num; i++) cin >> set[i].end; cin >> s >> e; qsort(set + 1, num, sizeof(set[1]), cmp); Rightful(); hoge(); //pri(); printf("%d\n", sum); } return 0; }
原文地址:https://www.cnblogs.com/woxiaosade/p/10323380.html
时间: 2024-10-29 12:40:17