C语言今年暑假不AC&&凌乱的yyy / 线段覆盖(贪心算法)

今年暑假不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;
}

猜你喜欢

转载自blog.csdn.net/The_onion/article/details/121873090