2011-08-21 19:23:20Morris

d906. 2. 排座位問題

d906. 2. 排座位問題

內容 :

豐收國小是一所迷你小學,一年級只有6個新生入學,所以老師將他們的座位排在一個2×3的格子圖形中,並且將座位編號(1編到6),如圖三的編號法:

1

2

3

4

5

6

                             圖三

為了學生視力的考量,老師每個月第1天上課都會換一次座位。座位排法有以下規則:

1.單月數(例如1月、3月、5……)以學生學號為準排序,由小排到大。雙月數(例如2月、4月、6……)以學生身高為準排序,由矮排到高,如果身高相同,學號號碼較小的同學排在前面。學生學號不會和別人重覆,但學生身高可能和別人相同。

2.老師以抽簽的方式,從16抽出一個數字,決定排序最前面的同學要坐幾號位置,接下來按照排序順序,坐在前面同學的後一號位置,而坐在6號位置後一號的同學必須坐到1號。

在這個排法中,編號2號的座位最靠近講台及老師,所以每次排完位置後,大家都迫不及待的想知道坐在2號位置的同學是誰?例如:班上同學在11月換座位,6位學生依學號排序後,得到學生姓名為ABCDEF,老師抽簽抽到5號,則最後的坐法如圖四:

C

D

E

F

A

B

                             圖四

所以坐在2號位置的是D

現在請你寫程式判斷排完座位後,坐在編號2號位置的同學是誰?

輸入說明 :

第一行有一個正整數m (1≤ m ≤ 12)m代表換座位時的月份。

第二行有一個正整數n (1≤ n ≤ 6)n為老師抽簽抽到的數字。

第三行到第八行為學生的資料,每一行有三項資料,中間以空白隔開。第一項資料是學生姓名,以一個大寫英文字母(A-Z)代表;第二項資料是學生座號,由3位數字(001-999)組成;第三項資料是學生身高,由3位數字(001-999)組成,代表身高幾公分。

輸出說明 :

請輸出1個字母,代表坐在編號2號位置的學生姓名。

範例輸入 :

輸入範例一
11
5
A 101 147
B 102 120
C 103 108
D 104 130
E 105 140
F 106 120


輸入範例二
4
2
L 102 127
K 101 120
M 103 138
B 104 130
A 106 110
S 105 120

範例輸出 :

輸出範例一
D


輸出範例二
A

提示 :

出處 :

2010三重考區 (管理:pcshic)


作法 : 模擬
練習一下函式指標, 有點寫長了, 不過蠻有成就感的

/**********************************************************************************/
/*  Problem: d906 "2. 排座位問題" from 2010三重考區                      */
/*  Language: C                                                                   */
/*  Result: AC (0ms, 187KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-21 16:08:17                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
typedef struct {
    char name[2];
    int id, h;
}D;
D Data[6], X[6];
int cmp1(D A, D B) {
    return A.id < B.id;
}
int cmp2(D A, D B) {
    return A.h < B.h || (A.h == B.h && A.id < B.id);
}
void Merge(int l, int m, int h, int cmp(D, D)) {
    int In1 = l, In2 = m+1;
    int a, b, Top = 0;
    while(In1 <= m && In2 <= h)
        if(cmp(Data[In1], Data[In2]))    
            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, int cmp(D, D)) {
    if(l < h) {
        int m = (l+h)/2;
        MergeSort(l, m, cmp);
        MergeSort(m+1, h, cmp);
        Merge(l, m, h, cmp);
    }
}
main() {
    int m, n, a;
    int Ans[7] = {0, 1, 0, 5, 4, 3, 2};
    int ( *Function[2])(D, D) = {cmp2, cmp1};
    while(scanf("%d %d", &m, &n) == 2) {
        for(a = 0; a < 6; a++)
            scanf("%s %d %d", Data[a].name, &Data[a].id, &Data[a].h);
        MergeSort(0, 5,( *Function[m&1]));
        printf("%s\n", Data[Ans[n]].name);
    }
    return 0;
}