今年暑假不AC
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%…”
确实如此,世界杯来了,球迷的节日也来了,估计很多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
目标是能看尽量多的完整节目,所以我们在选择节目时每次都选择符合条件中完成最早的节目(完成早的节目必定开始的早)。
#include <stdio.h>
#include <string.h>
int main()
{
int n, i, j;
int t;
int time, count ;
int a[101], b[101] ;
while(scanf("%d", &n) != EOF && n != 0)
{
for (i = 0; i < n; i++)
{
scanf("%d%d", &a[i], &b[i]) ;
}
//按找完成时间早的顺序进行排序
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
{
if (b[i] > b[j])
{
t = b[j] ;
b[j] = b[i] ;
b[i] =t ;
t = a[j];
a[j] = a[i] ;
a[i] = t ;
}
}
time = 0,cnt = 0;
for (i = 0; i < n; i++)
{
if (a[i] >= time)
{
cnt++ ;
time = b[i] ;
}
}
printf("%d\n", cnt) ;
}
return 0 ;
}
凌乱的yyy / 线段覆盖
题目背景
快 noip 了,yyy 很紧张!
题目描述
现在各大 oj 上有 nn 个比赛,每个比赛的开始、结束的时间点是知道的。
yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。
所以,他想知道他最多能参加几个比赛。
由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 2 个及以上的比赛。
输入
第一行是一个整数 nn ,接下来 n 行每行是 2 个整数,表示比赛开始、结束的时间。
输出
一个整数最多参加的比赛数目。
输入
3
0 2
2 4
1 3
输出
2
经过观察我们会发现这两道题的思路是一样的,但是第二题的数据跨度明显比第一道题大的多,这时候我们就不能使用双重循环对数组进行排序,可以使用一些时间复杂度低的排序算法进行计算,来满足时间的要求。
我在这里使用了快速排序,成功的AC了。
#include<stdio.h>
void qsort(int a[], int left, int right, int b[]){
if(left > right){
return ;
}
int temp = a[left], t2 = b[left];
int i = left, j = right;
while(i != j){
while(a[j] >= temp && j > i){
j-- ;
}
while(a[i] <= temp && j > i){
i++ ;
}
if(i < j){
int t = a[i];
a[i] = a[j];
a[j] = t;
t = b[i];
b[i] = b[j];
b[j] = t;
}
}
a[left] = a[i], b[left] = b[i];
a[i] = temp, b[i] = t2;
qsort(a, left, i - 1, b);
qsort(a, i + 1, right, b);
}
int main()
{
int n;
scanf("%d", &n);
int a[n], b[n];
for(int i = 0; i < n; i++ ){
scanf("%d%d", &a[i], &b[i]);
}
qsort(b, 0 , n - 1, a);
int time = 0, cnt = 0;
for(int i = 0; i < n; i++){
if(a[i] >= time){
cnt++ ;
time = b[i];
}
}
printf("%d", cnt);
return 0;
}