2011-06-13 22:26:36Morris

d961. A. 耶誕老人到你家

http://zerojudge.tw/ShowProblem?problemid=d961

內容 :

  一年一度的耶誕節即將到來,但是耶誕老人的麋鹿卻意外得了重感冒無法出門,導致他陷入禮物送不出的窘境,而這將會造成世界上所有乖寶寶變壞的可怕後果!

  情急之下,耶誕老人想借用你飼養的奶牛們擔任運送禮物的任務,他願意拿出所有你能裝進箱子的禮物作為交換,但是每個箱子都只能裝一個禮物,也不能把禮物或箱子割開。興奮的你迅速翻出家裡所有的空箱子,打算狠狠地撈這位可憐的耶誕老人一票!

輸入說明 :

測資包含多組測試資料,第一列有一個整數 T 表示接下來有幾組測試資料。

  每組測試資料共有三列,第一列有兩個整數 N, M,分別代表禮物與箱子數量,第二列有 N 個整數表示各個禮物的大小,第三列有 M 個整數表示各個箱子的大小,禮物與箱子的大小皆介於 1 231 - 1 之間 (1 N, M 50000)。若 x y,則一個大小為 x 的禮物可以裝在一個大小為 y 的箱子裡面。

輸出說明 :

對每筆測試資料輸出你能帶走的禮物數量,若你無法帶走任何禮物則輸出 Santa Claus wishes you get AC in the next submission.

範例輸入 :

2
4 5
5 10 15 20
10 10 10 10 10
1 1
10
5

範例輸出 :

2
Santa Claus wishes you get AC in the next submission.

提示 :

出處 :

2010 NPSC 高中組決賽 (管理:pcshic)



作法 : Greedy
先將禮物跟盒子分別由小排到大
盒子裝不下禮物,則換下一個大盒子 ... 持續

/**********************************************************************************/
/*  Problem: d961 "A. 耶誕老人到你家" from 2010 NPSC 高中組決賽       */
/*  Language: C                                                                   */
/*  Result: AC (128ms, 844KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-06-11 09:25:44                                     */
/**********************************************************************************/


#include<stdio.h>
typedef struct {
    int t;
}Data;
Data X[50000];
void Merge(int l, int m, int h, Data A[]) {
    int In1 = l, In2 = m+1;
    int a, b, Top = 0;
    while(In1 <= m && In2 <= h)
        if((A[In1].t < A[In2].t))
             X[Top++] = A[In1++];
       else  X[Top++] = A[In2++];
    while(In1 <= m)   X[Top++] = A[In1++];
    while(In2 <= h)   X[Top++] = A[In2++];
    for(a=0,b=l;a<Top;a++,b++)
        A[b]=X[a];
}
void MergeSort(int l, int h, Data A[]) {
    if(l < h) {
        int m = (l+h)/2;
        MergeSort(l  , m, A);
        MergeSort(m+1, h, A);
        Merge(l, m, h, A);
    }
}
main() {
    int t, n, m, a;
    Data A[50000], B[50000];
    scanf("%d", &t);
    while(t--) {
        scanf("%d %d", &n, &m);
        for(a = 0; a < n; a++)    scanf("%d", &A[a].t);
        for(a = 0; a < m; a++)    scanf("%d", &B[a].t);
        MergeSort(0, n-1, A);
        MergeSort(0, m-1, B);
        int in1 = 0, in2 = 0, Ans = 0;
        for(; in1 < n && in2 < m; in2++) {
            if(A[in1].t <= B[in2].t)
                Ans++, in1++;
        }
        if(Ans)    printf("%d\n", Ans);
        else puts("Santa Claus wishes you get AC in the next submission.");
    }
    return 0;
}