1. 程式人生 > >貪心演算法作業之會場安排問題

貪心演算法作業之會場安排問題

問題描述

假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計一個貪心演算法進行安排。

演算法設計

對於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; }