贪心算法作业之会场安排问题

问题描述

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个贪心算法进行安排。

算法设计

对于K个待安排的活动,计算使用最少会场的时间表。

输入输出

input.txt
5
1 23
12 28
25 35
27 80
36 50
output.txt
3

分析解答

这个算法可以用GreedySelector来安排会场。最坏情况下算法需要O(n^2)计算时间。
实际上可以设计出一个更有效的算法。
将n个活动看作是实直线上的n个半闭活动区间[s[i],f[i]],实际上求这n个半闭区间的最大重叠数。重叠的活动区间相应的活动是互不相容的额,这样,求得的m个重叠区间,得到,至少要安排m个会场来容纳m个活动。

#include <iostream>
#include <vector>//标准库 容器
#include <algorithm>//调用sort函数
using std::vector;
using namespace std;
struct point
{
    int t;
    bool f;
};
bool cmp(point x,point y)
{
    return x.t<y.t;//升序排列,如果改为return x.t>y.t,则为降序

}
int greedy(vector<point> x)
{
    int sum=0,cur=0,n=x.size();
    sort(x.begin(),x.end(),cmp);
    for(int i=0;i<n;i++)
    {
        if(x[i].f)
            cur++;
        else
            cur--;
       if(cur>sum)
            sum=cur;
    }
    return sum;
}
int main()
{
    vector<point> x;
    int n,i;
    point temp;
    while(cin>>n,n)
    {
        for(i=0;i<n;i++)
        {
            temp.f=true;
            cin>>temp.t;
            x.push_back(temp);
            temp.f=false;
            cin>>temp.t;
            x.push_back(temp);
        }
        cout<<greedy(x)<<endl;
        x.clear();
    }
    return 0;
}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/sinat_27714067/article/details/51155503
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞