首页 > 试题广场 >

主持人调度(二)

[编程题]主持人调度(二)
  • 热度指数:71308 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

数据范围: -2^{32} \le start_i\le end_i \le 2^{31}-1

复杂度要求:时间复杂度 ,空间复杂度
示例1

输入

2,[[1,2],[2,3]]

输出

1

说明

只需要一个主持人就能成功举办这两个活动      
示例2

输入

2,[[1,3],[2,4]]

输出

2

说明

需要两个主持人才能成功举办这两个活动      

备注:
start_i,end_i在int范围内
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
int partition(int** arr, int left, int right, int part) {
    int pivot = arr[right][part];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (arr[j][part] < pivot) {
            i++;
            swap(&arr[i][part], &arr[j][part]);
        }
    }
    swap(&arr[i + 1][part], &arr[right][part]);
    return i + 1;
}
void quicksort(int** arr, int left, int right, int part) {
    if (left < right) {
        int pivot = partition(arr, left, right, part);
        quicksort(arr, left, pivot - 1, part);
        quicksort(arr, pivot + 1, right, part);
    }
}

int minmumNumberOfHost(int n, int** startEnd, int startEndRowLen,
                       int* startEndColLen ) {
    int i, j;
    for(i = 0; i < n/2; i++) {
        if(memcmp(startEnd[2*i], startEnd[2*i+1], 2*sizeof(int))!=0) {
            quicksort(startEnd, 0, n-1, 0);
            quicksort(startEnd, 0, n-1, 1);
            break;
        }
    }

    for (i = 1, j = 0; i < n; i++) {
        if (startEnd[i][0] >= startEnd[j][1])
            j++;
    }
    return i-j;
}

编辑于 2024-03-26 23:03:41 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算成功举办活动需要多少名主持人
 * @param n int整型 有n个活动
 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
 * @param startEndRowLen int startEnd数组行数
 * @param startEndColLen int* startEnd数组列数
 * @return int整型
 */
int compare(const void *a,const void *b) {
    return *(int*)a>*(int*)b;
}
int minmumNumberOfHost(int n, int** startEnd, int startEndRowLen, int* startEndColLen ) {
    // write code here
    int *Start=(int*)malloc(sizeof(int)*n);
    int *End=(int*)malloc(sizeof(int)*n);
    for(int i=0;i<n;i++){
        Start[i]=startEnd[i][0];
        End[i]=startEnd[i][1];
    }
    //对开始和结束进行排序
    qsort(Start,n,sizeof(int),compare);
    qsort(End,n,sizeof(int),compare);
    int res=0,count=0,j=0,k=0;
    //有一个活动开始count++,有一个活动结束count--,用res接收count的最大值,最大值就是主持人最多的时候
    for(int i=0;i<n;i++){
        //每个开始时间作比较
        while(j<n && (Start[j]<=Start[i])){
            j++;
            count++;
        }
        //每个结束时间作比较
        while(k<n && (End[k]<=Start[i])){
            k++;
            count--;
        }
        //获取count最大值
        if(res<count)
            res=count;
    }
    return res;
}
发表于 2023-10-06 23:50:37 回复(0)
【求解】
求解,求帮忙完善一下代码。刚刷了一到题的彩笔
我的思路。
(1)先排序
(2)初始化一个flag数组,全部初始为0
(3)让一个主持人走完全程,标记flag[i]=1,每走完一个组,令n--,当n==1,说明全部已经走完。
  (4)若n!=0;那么令主持人y++,遍历(已经访问的不再访问,flag[i]!=1)。直到n==1,结束。

【疑惑】没有采用快速排序。呃,因为我忘了。这是我自己想的,我也没有数据结构与算法基础。能否帮忙一下。这是我的代码,很烂,勿喷。
void flag_init(int *flag,int ** startEnd,int startEndRowLen){
    int min_temp=999999999;
    int z;
    for(int i=0;i<10*10*10*10*10-1;i++)
        flag[0]=0;

    for(int i=0;i<startEndRowLen;i++){
        int temp;
          for(int j=i;j<startEndRowLen;j++)
                if(startEnd[j][0]<min_temp){
                    min_temp=startEnd[j][0];
                    z=j;
                }
           temp=startEnd[i][0];
           startEnd[i][0]=startEnd[z][0];
           startEnd[z][0]=temp;
    }
}
int minmumNumberOfHost(int nint** startEndint startEndRowLenintstartEndColLen ) {
    // write code here
    int flag[10*10*10*10*10-1];
    flag_init(flag,startEnd,startEndRowLen);
    int lastlen=1;
    int y=0;
    int z=n;
    while(n!=1){
            y++;
        for(int i=0;i<z;i++){
            if(startEnd[i][0]>=lastlen&&flag[i]!=1){
                lastlen=startEnd[i][1];
                flag[i]=1;
                n--;
            }
        }
        
        lastlen=1;
    }
    return y;
}

发表于 2022-11-09 18:34:17 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算成功举办活动需要多少名主持人
 * @param n int整型 有n个活动
 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
 * @param startEndRowLen int startEnd数组行数
 * @param startEndColLen int* startEnd数组列数
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
long long compare(const void *a,const void *b){
    return *(long long*)a-*(long long*)b;
}
int minmumNumberOfHost(int n, int** startEnd, int startEndRowLen, int* startEndColLen ) {
    // write code here
    //辅助数组分别获得开始和结束时间
    long long*Start=(long long*)malloc(sizeof(long long)*n),*End=(long long*)malloc(sizeof(long long)*n);
    for(int i=0;i<n;i++){
        Start[i]=startEnd[i][0];
        End[i]=startEnd[i][1];
    }
    //对开始时间和结束时间分别排序
    qsort(Start,n,sizeof(long long),compare);
    qsort(End,n,sizeof(long long),compare);
    //判断活动开始时间是否晚于前一个活动
    int j=0,res=0;
    for(int i=0;i<n;i++){
        if(Start[i]>=End[j])
            j++;
        else
            res++;
    }
    printf("%d",sizeof(short));
    return res;
}
为什么这个只能通过80%呢?

发表于 2022-04-05 22:26:58 回复(1)