2 solutions

  • 1
    @ 2022-2-17 16:21:59

    这道题跟活动安排那道题是一模一样的原理,在活动安排那道题中,要保证活动之间时间不冲突,能举办的活动的最大个数,而此题要求的是线段之间互不重复的个数的最大值,时间是线性的,线段也是线性的,因此此题完全可以按照线段的截止长度从小到大进行排序,如果这样可以尽量保证上一个线段结束后后一个线段马上开始,类似活动安排,上一个活动结束后,后一个活动马上进行,如果上一个活动结束后,那么就舍弃掉后一个活动,让上一个活动继续与后面进行对比

    #include<stdio.h>
    #include<stdlib.h>
    /*要判断线段之间两两没有重复的部分,这让我想起了活动安排的例题
    ,选出互相兼容的活动的最大个数,按线段结尾的数从小到大的顺序进行排列,如果b<=a则没有重叠的部分
    */ 
    typedef struct line{
    	int a;
    	int b;
    }Lin;
    Lin array[1000001];
    int comp(const void *a,const void *b){
    	//将void *强制转化为结构体指针类型 
    	 Lin *c = (Lin *)a;
    	 Lin *d = (Lin *)b;
    	 return c->b-d->b;
    }
    int main(){
        int n;
        int number = 1;
    	scanf("%d",&n);//输入n表示行数 
    	for(int i=0; i<n; i++){
    		scanf("%d %d",&array[i].a,&array[i].b);//输入a和b描述线段 
    	}
    	qsort(array,n,sizeof(array[0]),comp);
    		for(int i=0; i<n-1; i++){
            if(array[i].b <= array[i+1].a){
            	number++;
    		}
    		else{
    		   	array[i+1] = array[i];
    		}  		 
    	}
    	printf("%d",number);	
    } 
    

    Information

    ID
    96
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    6
    Tags
    # Submissions
    144
    Accepted
    45
    Uploaded By