d906. 2. 排座位問題
內容 :
豐收國小是一所迷你小學,一年級只有6個新生入學,所以老師將他們的座位排在一個2×3的格子圖形中,並且將座位編號(從1編到6),如圖三的編號法:
1 | 2 | 3 |
4 | 5 | 6 |
圖三
為了學生視力的考量,老師每個月第1天上課都會換一次座位。座位排法有以下規則:
1.單月數(例如1月、3月、5月……)以學生學號為準排序,由小排到大。雙月數(例如2月、4月、6月……)以學生身高為準排序,由矮排到高,如果身高相同,學號號碼較小的同學排在前面。學生學號不會和別人重覆,但學生身高可能和別人相同。
2.老師以抽簽的方式,從1到6抽出一個數字,決定排序最前面的同學要坐幾號位置,接下來按照排序順序,坐在前面同學的後一號位置,而坐在6號位置後一號的同學必須坐到1號。
在這個排法中,編號2號的座位最靠近講台及老師,所以每次排完位置後,大家都迫不及待的想知道坐在2號位置的同學是誰?例如:班上同學在11月換座位,6位學生依學號排序後,得到學生姓名為A、B、C、D、E、F,老師抽簽抽到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)組成,代表身高幾公分。
輸出說明
:
範例輸入 :
輸入範例一 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
提示
:
出處
:
/**********************************************************************************/
/* 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;
}
上一篇:a141. 變態想要學妹!!!
下一篇:a224. 明明愛明明