24h購物| | PChome| 登入
2011-06-21 10:03:23| 人氣633| 回應0 | 上一篇 | 下一篇

b240. C. 瘋狂博士的小型圖書館

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

b240. C. 瘋狂博士的小型圖書館

內容 :

瘋狂博士X是一個很龜毛的人,他有很多奇怪的原則,例如:不穿有兩顆釦子的衣服、坐下來的時候不可以朝向東方、下雨天不能坐公車、喝黑咖啡要用深藍色的馬克杯,如果是加糖的咖啡一定要用白色的咖啡杯裝著,而且加糖的步驟一定要是先加 塊方糖、攪拌 2 下、加入 5 毫升的鮮奶、再攪拌 7 下,最後看他當天的心情決定要補加多少砂糖。 

瑞特是瘋狂博士X的鄰居,每個星期天下午會到瘋狂博士X家幫他整理家務。瑞特的工作包括整理瘋狂博士X的小型圖書館,最近瘋狂博士X買回家的書似乎有越來越多的趨勢,他希望有人可以幫他寫一個有下列功能的程式:輸入瑞特手邊的書籍資料,程式會自動輸出這些書籍的排序。

值得注意的是,在瘋狂博士X的心中,AEIOU五個母音的順序是OAUIE,而且X26個字母之首;所以對於瘋狂博士X而言,英文字母的順序如下:XOBCDAFGHUJKLMNIPQRSTEVWYZ

書籍擺放方式的規則:

1. 先按照作者的名字排序,

2. 作者相同的書籍再按照書籍問世的年份排序,

3. 如果作者、出版年份都相同則按照書名排序。

千萬不要忘記這裡的順序是按照瘋狂博士X心目中的英文字母順序排列!

輸入說明 :

總共只有一筆測試資料。

第一行有一個整數 N,代表總共有幾本書籍資料,至多 100 本書。

接下來共有 N 行,每一行描述一本書籍,格式為:「書籍作者, 書籍名稱 (出版年份)」,書籍作者和書籍名稱中間由一個逗點及一個空白字元分開。

「書籍作者」包括大小寫英文字母、半形句點或空白字元,至多 30 個字元。

「書籍名稱」包括大小寫英文字母或空白字元,至多 100 個字元。

「出版年份」必定為四位數字。

輸出說明 :

排序後的書單,按照瘋狂博士X心目中的英文字母順序排列與要求。排序時同一字母的大小寫視為相等,但輸出資料的大小寫必須和輸入資料一致。空白字元的順序較英文字母為先。半形句點的順序在空白字元和英文字母之間。

總共有N行輸出,格式為「書籍作者, 書籍名稱 (出版年份)」,與輸入格式相同。

範例輸入 :

12
Erle Stanley Gardner, Drifting Down the Delta (1969)
Agatha Christie, Five Little Pigs (1942)
Erle Stanley Gardner, Host With the Big Hat (1969)
J. R. R. Tolkien, Leaf by Niggle (1945)
Agatha Christie, The Body in the Library (1942)
Erle Stanley Gardner, The Case of the Murderers Bride (1969)
Erle Stanley Gardner, The Case of the Stuttering Bishop (1937)
J. R. R. Tolkien, The Hobbit (1937)
J. R. R. Tolkien, The Lay of Aotrou and Itroun (1945)
Agatha Christie, The Moving Finger (1942)
Crazy Doctor X, AAA (2009)
Crazy Doctor X, XXX (2009)

範例輸出 :

Crazy Doctor X, XXX (2009)
Crazy Doctor X, AAA (2009)
Agatha Christie, Five Little Pigs (1942)
Agatha Christie, The Body in the Library (1942)
Agatha Christie, The Moving Finger (1942)
J. R. R. Tolkien, The Hobbit (1937)
J. R. R. Tolkien, Leaf by Niggle (1945)
J. R. R. Tolkien, The Lay of Aotrou and Itroun (1945)
Erle Stanley Gardner, The Case of the Stuttering Bishop (1937)
Erle Stanley Gardner, Drifting Down the Delta (1969)
Erle Stanley Gardner, Host With the Big Hat (1969)
Erle Stanley Gardner, The Case of the Murderers Bride (1969)

提示 :

出處 :

2009 NPSC 高中組初賽



作法 : 字串分析與排序
不過對於C++,這東西幾乎沒有什麼困難
C就手動吧

/**********************************************************************************/
/*  Problem: b240 "C. 瘋狂博士的小型圖書館" from 2009 NPSC 高中組初賽*/
/*  Language: C                                                                   */
/*  Result: AC (4ms, 306KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-20 14:51:27                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
struct {
    char book[101], name[31];
    int n;
}Data[100], X[100];
char ASCII[256];
char sort[] = "XOBCDAFGHUJKLMNIPQRSTEVWYZ";
int compare(int In1, int In2) {
    int a, flag = 0;
    for(a = 0; ; a++) {
        if(ASCII[Data[In1].name[a]] < ASCII[Data[In2].name[a]])
            return 1;
        else if(ASCII[Data[In1].name[a]] > ASCII[Data[In2].name[a]])
            return 0;
        if(Data[In1].name[a] == Data[In2].name[a] && Data[In1].name[a] == '\0') break;
    }
    if(Data[In1].n < Data[In2].n) return 1;
    else if(Data[In1].n > Data[In2].n) return 0;
    for(a = 0; ; a++) {
        if(ASCII[Data[In1].book[a]] < ASCII[Data[In2].book[a]])
            return 1;
        else if(ASCII[Data[In1].book[a]] > ASCII[Data[In2].book[a]])
            return 0;
    }
}
void Merge(int l, int m, int h) {
    int In1 = l, In2 = m+1;
    int a, b, Top = 0;
    while(In1 <= m && In2 <= h) {
        if(compare(In1, In2) == 1) {
            X[Top++] = Data[In1++];
        }
        else {
            X[Top++] = Data[In2++];
        }
    }
    while(In1 <= m) X[Top++] = Data[In1++];
    while(In2 <= h) X[Top++] = Data[In2++];
    for(a = 0, b = l; a < Top; a++, b++)
        Data[b] = X[a];
}
void MergeSort(int l, int h) {
    if(l < h) {
        int m = (l+h)/2;
        MergeSort(l, m);
        MergeSort(m+1, h);
        Merge(l, m, h);
    }
}
main() {
    int n, a, b, t;
    char s[201];
    for(a = 0; a < 26; a++)
        ASCII[sort[a]] = a;
    for(a = 0; a < 26; a++)
        ASCII[sort[a]-'A'+'a'] = a;
    while(scanf("%d", &n) == 1) {
        getchar();
        for(a = 0; a < n; a++) {
            gets(s);
            for(b = 0, t = 0; s[b]; b++) {
                if(s[b] == ',') {b+=2;break;}
                Data[a].name[t++] = s[b];
            }
            Data[a].name[t] = '\0';
            for(t = 0; s[b]; b++) {
                if(s[b] == '(') {b++;break;}
                Data[a].book[t++] = s[b];
            }
            Data[a].book[t-1] = '\0';
            for(t = 0; s[b]; b++) {
                if(s[b] <= '9' && s[b] >= '0')
                    t = t*10 + s[b]-'0';
            }
            Data[a].n = t;
        }
        MergeSort(0, n-1);
        for(a = 0; a < n; a++) {
            printf("%s, %s (%d)\n", Data[a].name, Data[a].book, Data[a].n);
        }
    }
    return 0;
}

台長: Morris
人氣(633) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: NPSC |
此分類下一篇:b254. C. 矢量星球
此分類上一篇:d946. D. 阿克圖洛斯‧蒙斯克的煩惱

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