豐收國小是一所迷你小學,一年級只有6個新生入學,所以老師將他們的座位排在一個2×3的格子圖形中,並且將座位編號 (從 1 編到 6),如下圖的編號法:
1 | 2 | 3 |
4 | 5 | 6 |
為了學生視力的考量,老師每個月第1天上課都會換一次座位。座位排法有以下規則:
- 單月數 (例如 1 月、3 月、5 月 ……) 以學生學號為準排序,由小排到大。
- 雙月數 (例如 2月、4 月、6 月 ……) 以學生身高為準排序,由矮排到高,如果身高相同,學號號碼較小的同學排在前面。學生學號不會和別人重覆,但學生身高可能和別人相同。
- 老師以抽簽的方式,從 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) 組成,代表身高幾公分。 | 請輸出 1 個字母,代表坐在編號 2 號位置的學生姓名。 |
11 5 A 101 147 B 102 120 C 103 108 D 104 130 E 105 140 F 106 120 | D |
4 2 L 102 127 K 101 120 M 103 138 B 104 130 A 106 110 S 105 120 | A |
解題思路
使用 Map 來存每個座號所對應到的字元,如果是使用座號排序則將座號放到陣列中後進行排序,如果是用身高排序的話則使用 Pair 來排序,身高放前面,座號放後面。最後輸出第二個座位上的學生姓名即可。
範例程式碼-ZeroJudge D906: 排座位問題
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
pair<int, int> rtn (int a, int b)
{
pair<int, int> tmp;
tmp.first = a;
tmp.second = b;
return tmp;
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
map<int, int>index;
index[1] = 1;
index[2] = 0;
index[3] = 5;
index[4] = 4;
index[5] = 3;
index[6] = 2;
int M, N;
cin >> M >> N;
if (M % 2 == 1)
{
vector<int>num;
map<int, char>MAP;
for (int i = 0; i<6; i++)
{
char ch;
int ID, height;
cin >> ch >> ID >> height;
MAP[ID] = ch;
num.push_back(ID);
}
sort(num.begin(), num.end());
cout << MAP[num[index[N]]] << "\n";
}
else
{
vector<pair<int, int>>num;
map<pair<int, int>, char>MAP;
for (int i = 0; i<6; i++)
{
char ch;
int ID, height;
cin >> ch >> ID >> height;
MAP[rtn(height, ID)] = ch;
num.push_back(rtn(height, ID));
}
sort(num.begin(), num.end());
cout << MAP[num[index[N]]] << "\n";
}
}
//ZeroJudge D906
//Dr. SeanXD