題目敘述
每筆測資第一行有一個正整數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";
}
}
留言
張貼留言