1. 程式人生 > >nyoj 14-會場安排問題 (貪心)

nyoj 14-會場安排問題 (貪心)

iostream cep 測試數據 學校 大於 tdi 步驟 accept 活動

14-會場安排問題


內存限制:64MB 時間限制:3000ms Special Judge: No
accepted:9 submit:15

題目描述:

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

輸入描述:

第一行是一個整型數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時間開始 分析:   想要安排最多的場次就要在條件允許的情況下選擇開會時間最短的會議,
  ∴如果按照結束時間來貪心那麽相對最先得到滿足條件的會議就是開會時間最短的(Σcnt 就是最大的) 步驟:   ①、將數據按照結束時間升序排序   ②、初始化第一個節點的結束時間為判定時間 temp   ③、如果一個點的開始時間大於temp就將temp變為改點的結束時間   ④、循環判斷所有的點 核心代碼:
1 int temp = P[0].r;
2 for(int i = 1; i < n; ++ i)
3 {
4     if(P[i].l > temp)
5     {
6         cnt ++; //Σ的最終結果即為最多的會場次數
7         temp = P[i].r;
8 } 9 }

C/C++代碼實現(AC):

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <stack>
10 
11 using namespace std;
12 
13 struct node
14 {
15     int l, r;
16 } P[10010];
17 
18 bool cmp(node a, node b)
19 {
20     return a.r < b.r;
21 }
22 
23 int main ()
24 {
25     int t;
26     scanf("%d", &t);
27     while (t --)
28     {
29         int cnt = 1, n;
30         scanf("%d", &n);
31         for(int i = 0; i < n ; ++i)
32             scanf("%d%d", &P[i].l, &P[i].r);
33         sort(P, P+n, cmp);
34 
35         int temp = P[0].r;
36         for(int i = 1; i < n; ++ i)
37         {
38             if(P[i].l > temp)
39             {
40                 cnt ++;
41                 temp = P[i].r;
42             }
43         }
44         printf("%d\n", cnt);
45     }
46     return 0;
47 }

  

nyoj 14-會場安排問題 (貪心)