ZeroJudge D906: 排座位問題

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

123
456

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

  1. 單月數 (例如 1 月、3 月、5 月 ……) 以學生學號為準排序,由小排到大。
  2. 雙月數 (例如 2月、4 月、6 月 ……) 以學生身高為準排序,由矮排到高,如果身高相同,學號號碼較小的同學排在前面。學生學號不會和別人重覆,但學生身高可能和別人相同
  3. 老師以抽簽的方式,從 1 到 6 抽出一個數字,決定排序最前面的同學要坐幾號位置,接下來按照排序順序,坐在前面同學的後一號位置,而坐在 6 號位置後一號的同學必須坐到 1 號。

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

CDE
FAB

所以坐在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
ZeroJudge D906 範例測資

解題思路

使用 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

發佈留言