24h購物| | PChome| 登入
2011-08-28 07:19:39| 人氣3,357| 回應0 | 上一篇 | 下一篇

d731. 11039 - Building designing

推薦 0 收藏 0 轉貼0 訂閱站台

d731. 11039 - Building designing

內容 :

有個建築師要設計一棟很高的大樓。這大樓會有許多樓層,每個樓層的面積必須大於它上一層的面積。再者,設計師 (他是某個西班牙足球隊的球迷) 要把每層樓漆成藍色或紅色,相鄰的兩個樓層顏色必須不同。

建築師現有 n 個特定顏色與面積的樓層可供建構大樓,每個樓層的面積均不同。建築師希望在上述的條件下以現有可用的樓層建構出最高的大樓。

輸入說明 :

輸入的第一行有測資的筆數 p。 每筆測資的第一行是可用的樓層數。接下來每一行代表一個樓層的顏色與面積。每個樓層以一個介於 -999999 與 999999 間的整數表示。沒有面積為 0 的樓層。負數為紅色樓層;正數則為藍色樓層。絕對值則是面積。沒有任何兩個樓層的面積相同。最大的樓層數為 500000。

輸出說明 :

每筆測資輸出依上述條件所得的最大樓層數於一行。

範例輸入 :

2
5
7
-2
6
9
-3
8
11
-9
2
5
18
17
-15
4

範例輸出 :

2
5

提示 :

出處 :

UVa ACM 11039 (管理:snail)



作法 : Greedy
分兩堆做好, 排序結束後, 從兩個陣列中交錯拿出符合且最大的數字

/**********************************************************************************/
/*  Problem: d731 "11039 - Building designing" from UVa ACM 11039                 */
/*  Language: C                                                                   */
/*  Result: AC (196ms, 4236KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-08-27 20:01:41                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#define oo 2147483647
int A[500000], B[500000];
int cmp(const void *a, const void *b) {
    int *aa, *bb;
    aa = (int *)a, bb = (int *)b;
    return *aa < *bb;
}
main() {
    int t, n, x, a;
    scanf("%d", &t);
    while(scanf("%d", &n) == 1) {
        int Aidx = 0, Bidx = 0;
        for(a = 0; a < n; a++) {
            scanf("%d", &x);
            if(x > 0)    A[Aidx++] = x;
            else        B[Bidx++] = -x;
        }
        qsort(A, Aidx, sizeof(int), cmp);
        qsort(B, Bidx, sizeof(int), cmp);
        int in1 = 0, in2 = 0, last = oo, flag = 0;
        int tmp = 0, Ans = 0;
        while(in1 <= Aidx && in2 <= Bidx) {
            if(!flag) {
                while(A[in1] > last && in1 < Aidx)    in1++;
                if(in1 == Aidx)    break;
                last = A[in1], in1++;
            } else {
                while(B[in2] > last && in2 < Bidx)    in2++;
                if(in2 == Bidx)    break;
                last = B[in2], in2++;
            }
            tmp++, flag = 1-flag;
        }
        Ans = Ans > tmp ? Ans : tmp;
        in1 = 0, in2 = 0, last = oo, flag = 1, tmp = 0;
        while(in1 <= Aidx && in2 <= Bidx) {
            if(!flag) {
                while(A[in1] > last && in1 < Aidx)    in1++;
                if(in1 == Aidx)    break;
                last = A[in1], in1++;
            } else {
                while(B[in2] > last && in2 < Bidx)    in2++;
                if(in2 == Bidx)    break;
                last = B[in2], in2++;
            }
            tmp++, flag = 1-flag;
        }
        Ans = Ans > tmp ? Ans : tmp;
        printf("%d\n", Ans);
    }
    return 0;
}

台長: Morris
人氣(3,357) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:c107. Jack Straws
此分類上一篇:d242. Q481: What Goes Up

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文