1. 程式人生 > >nyoj 14 會場安排問題 貪心演算法

nyoj 14 會場安排問題 貪心演算法

這道題用了貪心演算法,什麼是貪心演算法呢?(以下來自百度百科)

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解

貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

思想

貪心演算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮一個數據,他的選取應該滿足區域性優化的條件。若下一個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止。

瞭解完貪心演算法後,我們來看一下這道題。

會場安排問題

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

輸入

第一行是一個整型數m(m<100)表示共有m組測試資料。
每組測試資料的第一行是一個整數n(1<n<10000)表示該測試資料共有n個活動。
隨後的n行,每行有兩個正整數Bi,Ei(0<=Bi,Ei<10000),分別表示第i個活動的起始與結束時間(Bi<=Ei)

輸出

對於每一組輸入,輸出最多能夠安排的活動數量。
每組的輸出佔一行

樣例輸入

2
2
1 10
10 11
3
1 10
10 11
11 20

樣例輸出

1
2

提示

注意:如果上一個活動在t時間結束,下一個活動最早應該在t+1時間開始

描述

學校的小禮堂每天都會有許多活動,有時間這些活動的計劃時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排一個活動。現在小劉有一些活動計劃的時間表,他想盡可能的安排更多的活動,請問他該如何安排。

一開始看到這道題,挺懵逼的,然後仔細思考了一陣子,猛然發現會場的安排的多少隻與時間表的結束時間有關,與開始時間無關,也就是說2-5與3-5本質上是一樣的,我們需要讓這些時間表的結束時間儘可量的早,才能按更多的活動。所以需要對資料進行一波處理,即對時間表按照結束時間從早到晚進行排序。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m;
struct sl
{
    int s;
    int e;
};
sl s[10005];
int compare (const void *a,const void *b)
{
    sl * pa=(sl*)a;
    sl * pb=(sl*)b;
    return pa->e>pb->e? 1:-1;
}
int main()
{
    scanf("%d",&m);
    while (m--)
    {
       scanf("%d",&n);
       for (int i=0;i<n;i++)
            scanf("%d%d",&s[i].s,&s[i].e);
       qsort (s,n,sizeof(s[0]),compare);
       int time=0;
       int num=0;
       for (int i=0;i<n;i++)
       {
          if(time<s[i].s)
          {
            time=s[i].e;
            num++;
          }
       }
       printf("%d\n",num);
    }
    return 0;
}