描述
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束 输出 对每组数据输出最多能看几部电影 样例输入
大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。
输入 多组数据。每组数据开头是n(n<=100),表示共n场电影。接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束 输出 对每组数据输出最多能看几部电影 样例输入
8 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 0样例输出
3
//c[i]表示使用前i个区间中的区间,所能得到的最长的子序列的区间个数
//需要先对所有的区间按照开始时间进行排序
#include<iostream>
#define MAX 1000
using namespace std;
int a[MAX], b[MAX], c[MAX];
int main()
{
int num;
cin >> num;
while (num != 0)
{
for (int i = 0; i<num; i++)
{
cin >> a[i] >> b[i];
c[i] = 1;
}
int ans = 1;
int tem;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < i; j++)
{
if (a[i] < a[j])
{
tem = a[i];
a[i] = a[j];
a[j] = tem;
tem = b[i];
b[i] = b[j];
b[j] = tem;
}
}
}
for (int i = 0; i<num; i++)
{
for (int j = 0; j<i; j++)
{
if (a[i] >= b[j] && c[i] <= c[j])c[i] = c[j] + 1;
if (c[i]>ans)ans = c[i];
}
}
cout << ans << endl;
cin >> num;
}
}
这道题目的本质是找最长的不下降子序列。
实际上直接使用贪心算法,按照结束时间进行排序,优先选择结束时间早的即可