貪心演算法作業之會場安排問題
阿新 • • 發佈:2019-01-26
問題描述
假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計一個貪心演算法進行安排。
演算法設計
對於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;
}