题目来源
作者: 王会勇
单位: 河北科技大学
时间限制: 1000 ms
内存限制: 32 MB
代码长度限制: 16 KB
问题描述
终于到周末了,明明是特别喜欢看电影。他想在一天内尽量多的看到完整的多部电影。 现在他把他喜欢的电影的播放时间表给你,希望你能帮他合理安排。
输入格式:
输入包含多组测试数据。每组输入的第一行是一个整数
n
(
n
<
=
100
)
n(n<=100)
n(n<=100),表示明明喜欢的电影的总数。 接下来
n
n
n行,每行输入两个整数
s
i
s_i
si和
e
i
(
1
<
=
i
<
=
n
)
e_i(1<=i<=n)
ei(1<=i<=n),表示第
i
i
i个电影的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。 当
n
=
0
n=0
n=0时,输入结束。
输出格式:
对于每组输入,输出能完整看到的电影的个数。
输入样例:
在这里给出一组输入。例如:
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
0
输出样例:
在这里给出相应的输出。例如:
5
思路分析
问题的关键在于要把电影按时长从小到大升序排列,优先安排时长短的电影,这样就能看到最多的电影。注意在排序时长的时候开始时间和结束时间也要跟着排序,所以要用结构体数组表示三个数据的集合。
算法实现
cpp
#include <iostream>
#include <algorithm>
using namespace std;
struct Movies{
int start; //电影开始时间
int end; //电影结束时间
int period; //电影持续时长
};
const int T = 24; //一天的总时间
bool strCompare(const Movies &a, const Movies &b)
{
return a.period < b.period; //表示升序输出
}
int package(int w, struct Movies *str);
int main()
{
int n = 1;
int i;
cin >> n;
while (n != 0)
{
struct Movies *str = new struct Movies[n]; //创建电影结构体数组
for (int i = 0; i<n; i++)
{
cin >> str[i].start;
cin >> str[i].end;
str[i].period = str[i].end - str[i].start;
}
sort(str, str + n, strCompare); //将电影结构体数组按电影时长从小到大排列
cout<<package(n, str)<<"\n";
cin >> n;
}
}
bool isFull(int *time, Movies m){
for (int i = m.start; i < m.end; i++){ //如果时间没有被占用,则返回false
if (time[i] > 0){
return false;
}
}
for (int i = m.start; i < m.end; i++){//如果时间某一段被占用,则返回true
time[i] = 1;
}
return true;
}
int package(int n, struct Movies *str){
int i, j;
int count = 0;
int time[T] = { 0 }; //表示空闲的时间
for (i = 0; i < n; i++)
{
if (isFull(time, str[i])){
count++; //记录可以看的电影的数量
}
}
return count;
}