2011-08-27 10:59:32Morris

b180. 1. 遊園接駁車

b180. 1. 遊園接駁車

內容 :

某一遊樂園分為水上樂園與探索樂園,旅客玩完水上樂園之後,接著便排隊搭乘單人客車進入探索樂園遊園。每部車只可搭載一名旅客進入探索樂園,旅客先到先搭車;如果某單人客車已經準備好要搭載旅客,但是此時並沒有等待中的旅客,那麼該輛車就必須等待。若旅客等待客車的時間超過 30 分鐘(包含30分鐘)就會放棄搭乘而離開園區。現在有一個由若干個旅客所組成的旅行團同時來到園區,請問在已知下列三個條件

(1) 該旅行團的旅客數量 (10<=m<=60)

(2) 該旅行團的個別旅客待在水上樂園的分鐘數 (1<=t<=60)

(3) 個別旅客環繞探索樂園的分鐘數 (1<=T<=60)

請撰寫程式計算至少需要幾部單人客車,才能滿足該旅行團所有的旅客,不讓旅客等超過30分鐘。 (mtT 皆為整數 ) 請輸出至少需要單人客車的數量 ?

輸入說明 :

第一行為該旅行團人數,接下來每一行都有兩筆數據,第一筆代表個別旅客待在水上樂園的分鐘數,第二筆代表個別旅客環繞探索樂園的分鐘數。(輸入順序未必按照旅客待在水上樂園的分鐘數排列)

輸出說明 :

至少需要單人客車的數量。

範例輸入 :

115 3040 3035 515 1030 2010 4045 550 55 1035 550 30510 2020 3010 4510 5015 30

範例輸出 :

23

提示 :

出處 :

97高市資訊學科能力競賽 (管理:khps9703)



作法 : DFS 直接下
爆搜直接拿 AC

/**********************************************************************************/
/*  Problem: b180 "1. 遊園接駁車" from 97高市資訊學科能力競賽      */
/*  Language: C                                                                   */
/*  Result: AC (2ms, 216KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-27 10:52:27                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#define oo 2147483647
typedef struct {
    int wait, time;
}D;
D Cust[61], X[61];
void Merge(int l, int m, int r) {
    int In1 = l, In2 = m+1;
    int a, b, Top = 0;
    while(In1 <= m && In2 <= r)
        if(Cust[In1].wait < Cust[In2].wait ||
        (Cust[In1].wait == Cust[In2].wait && Cust[In1].time < Cust[In2].time))
            X[Top++] = Cust[In1++];
        else
            X[Top++] = Cust[In2++];
    while(In1 <= m)    X[Top++] = Cust[In1++];
    while(In2 <= r) X[Top++] = Cust[In2++];
    for(a = 0, b = l; a < Top; a++, b++)
        Cust[b] = X[a];
}
void MergeSort(int l, int r) {
    if(l < r) {
        int m = (l+r)/2;
        MergeSort(l, m);
        MergeSort(m+1, r);
        Merge(l, m, r);
    }
}
int n, a, Ans, bike[61] = {};
void DFS(int now, int time) {
    if(now == n) {
        if(time < Ans)
            Ans = time;
        return;
    }
    if(time >= Ans)    return;
    int a, t;
    for(a = 0; a <= time; a++) {
        if(bike[a] < Cust[now].wait+30) {
            t = bike[a];
            if(bike[a] >= Cust[now].wait)
                bike[a] = bike[a] + Cust[now].time;
            else
                bike[a] = Cust[now].wait + Cust[now].time;
            DFS(now+1, time);
            bike[a] = t;
        }
    }
    bike[time+1] = Cust[now].time + Cust[now].wait;
    DFS(now+1, time+1);
}
main() {
    while(scanf("%d", &n) == 1) {
        for(a = 0; a < n; a++)
            scanf("%d %d", &Cust[a].wait, &Cust[a].time);
        MergeSort(0, n-1);
        Ans = oo, DFS(0, -1);
        printf("%d\n", Ans+1);
    }
    return 0;
}