ZeroJudge D906: 排座位問題

題目敘述

每筆測資第一行有一個正整數M,代表換座位時的月份。第二行有一個正整數N,代表老師抽籤抽到的號碼,代表經過特殊排序法過後第一個人要坐在哪個位置,後面的人以此類推,最後一個人的下一個會跑到第一個。再來會有六行,每一行會有一個字元和兩個整數,代表學生姓名、座號、身高。如果換座位時的月份是奇數月的話以學生座號進行排序,如果是偶數月的話以學生身高進行排序,如果有身高同樣的情況則座號較小的排在前面。要求輸出換座位後第二個位置坐的人是誰 (輸出代表學生姓名的字元)。


範例輸入 #1

11

5

A 101 147

B 102 120

C 103 108

D 104 130

E 105 140

F 106 120

範例輸出 #1

D


範例輸入 #2

4

2

L 102 127

K 101 120

M 103 138

B 104 130

A 106 110

S 105 120

範例輸出 #2

A


解題思路

使用Map來存每個座號所對應到的字元,如果是使用座號排序則將座號放到陣列中後進行排序,如果是用身高排序的話則使用Pair來排序,身高放前面,座號放後面。最後輸出第二個座位上的學生姓名即可。

解題程式碼如下 (僅供參考):

#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 M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge A263: 日期差幾天