C++贪心算法会场安排问题

问题描述

在这里插入图片描述
安排好所有的活动,并占用最少的会场。

题目分析

这个问题和我们之前说过的活动安排很相似,但是我们这次要求的是利用最少的会场。如果所有活动都是相容的,使用一个会场就可以举办完。一个会场可以举办一些相容的活动,而不相容的活动只能通过新会场举办。
所以这个问题,我们很容易可以想到利用并查集来解决,判断两个活动是否相容(前一个活动的结束时间<=后一个活动的开始时间),如果相容,就将二者连入同一集合。最后有几个集合就有多少个会场。这种方法很简单,但我用了更普通的方法。
设立flag数组表示对应索引的活动是否已经被安排了,如果被安排了就跳过。
在迭代的过程中,设立一个end_Time,当找到了相容活动时,用后一个活动的finish来更新end_Time,这样就不能不断地在其中找到相容活动,被分配的活动要将flag置为1.

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    int number;//活动数目
    cin>>number;
    vector<int>start;//活动开始数组
    vector<int>finish;//活动结束数组
    vector<int>flag;//标志活动是否被安排
    int s,f;//开始时间和结束时间
    for(int i = 0;i < number;i++)
    {
        cin>>s>>f;
        start.push_back(s);
        finish.push_back(f);
        flag.push_back(0);//flag初始化为0
    }
    int count = 0;
    for(int i = 0;i < number - 1;i++)
    {
        if(!flag[i])
            flag[i] = 1;
        else
            continue;
        int end_time = finish[i];
        for(int j = i+1;j < number;j++)
        {
            if(!flag[j])
            {
                if(start[j] >= end_time)
                {
                    flag[j] = 1;
                    end_time = finish[j];
                }
            }
        }
        count++;
    }
    cout<<count;
    return 0;
}

总结

时间复杂度O(n^2)。
空间复杂度O(n)
并查集算法无论在时间或者空间复杂度都很优质,但是我只是打搭了一个并查集的框架,没有实现具体的与问题相关的内容,所以先不晒了,以后有机会晒出来。

发布了60 篇原创文章 · 获赞 2 · 访问量 1048

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105668846