题解 | #活动安排#

活动安排

https://www.nowcoder.com/practice/16d971e9e42e4f3b9b1e2b8794796a43

#include <stdio.h>
#include<stdlib.h>

typedef struct time
{
    int x,y;
}time;
time arr[200000];//定义结构体数组,关联活动的开始和结束时间

void merge(time *arr,int l,int m,int r)//归并排序,防止时间超限
{
    int templ=l,tempr=m+1,temp=0;
    time *brr=(time *)malloc((r-l+1)*sizeof(time));
    while(templ<=m&&tempr<=r)//将活动结束的时间按从小到大排列
    {
        if(arr[templ].y<arr[tempr].y)
        {
            brr[temp++]=arr[templ++];
        }
        else
        {
            brr[temp++]=arr[tempr++];
        }
    }
    while(templ<=m)
    {
        brr[temp++]=arr[templ++];
    }
    while(tempr<=r)
    {
        brr[temp++]=arr[tempr++];
    }
    for(int i=0;i<r-l+1;i++)
    {
        arr[l+i]=brr[i];
    }
    free(brr);
}

//分解
void msort(time *arr,int l,int r)
{
    int m=(l+r)/2;
    if(l<r)
    {
        msort(arr,l,m);
        msort(arr,m+1,r);
        merge(arr,l,m,r);
    }
}


int main() 
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&arr[i].x,&arr[i].y);
    }
    msort(arr,0,n-1);
    int sum=1;
    for(int i=0;i<n-1;)
    {
        int temp=arr[i].y;
        while(1)
        {
            if(arr[i+1].x>=temp) //取后一个活动开始时间慢于当前活动的结束时间
            {
                sum++;
                break;
            }
            else if(i<n-2) i++;
            else break;//防止无限循环
        }
        i++;
    }
    printf("%d\n",sum);
    return 0;
}

全部评论

相关推荐

找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务