Problem Description
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
Sample Input
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
Sample Output
5
题意:有n个电视节目,给出每个节目播放的开始时间和结束时间,求最多可以看多少个节目
思路:排序问题,将节目根据结束时间从小到大排列,刚开始选择第一个节目,然后每次选择与当前选择的节目不冲突的节目,统计选择的节目的数目,即可以看的节目的最大数
import java.io.FileInputStream;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.Arrays;
public class Main implements Runnable
{
private static final boolean DEBUG = false;
private Scanner cin;
private PrintWriter cout;
private int n;
private static final int N = 101;
private Program[] p = new Program[N];
class Program implements Comparable
{
int start, end;
@Override
public int compareTo(Object other)
{
Program b = (Program)other;
if (end != b.end) return end - b.end;
return start - b.start;
}
}
private void init()
{
try {
if (DEBUG) {
cin = new Scanner(new InputStreamReader(new FileInputStream("f:\\OJ\\uva_in.txt")));
} else {
cin = new Scanner(new InputStreamReader(System.in));
}
cout = new PrintWriter(new OutputStreamWriter(System.out));
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean input()
{
n = cin.nextInt();
if (n == 0) return false;
for (int i = 0; i < n; i++) {
p[i] = new Program();
p[i].start = cin.nextInt();
p[i].end = cin.nextInt();
}
return true;
}
private void solve()
{
Arrays.sort(p, 0, n);
int start = p[0].end;
int ans = 1;
for (int i = 1; i < n;) {
int j = i;
while (j < n && p[j].start < start && p[j].end >= start) j++;
i = j;
if (j < n) {
start = p[j].end;
ans++;
}
i++;
}
cout.println(ans);
cout.flush();
}
@Override
public void run()
{
init();
while (input())
{
solve();
}
}
public static void main(String[] args)
{
// TODO code application logic here
new Thread(new Main()).start();
}
}