Official
B - Do you know the second highest mountain? Editorial
by
B - Do you know the second highest mountain? Editorial
by
penguinman
\(N\) 個の山を (高さ→名前) の順に優先度を付けて降順にソートした後、先頭から \(2\) 番目の山の名前を出力すればいいです。
計算量は \(M\) を \((S_i\) の長さの総和\()\) として \(O(M \log N)\) です。
解答例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int N; cin >> N;
vector<pair<int,string>> data(N);
for(int i=0; i<N; i++) cin >> data[i].second >> data[i].first;
sort(data.begin(),data.end(),std::greater{});
cout << data[1].second << endl;
}
解答例 (Python)
N = int(input())
data = []
for i in range(N):
S,T = map(str,input().split())
T = int(T)
data.append([T,S])
data.sort(reverse=True)
print(data[1][1])
なお、\(1\) 番高い山の情報と \(2\) 番目に高い山の情報を持ち、都度更新していくことで \(O(M)\) で解くことも可能です。
解答例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int N; cin >> N;
vector<string> S(N);
vector<int> T(N);
pair<int,string> top,sec;
top = sec = {0,""};
for(int i=0; i<N; i++){
cin >> S[i] >> T[i];
auto p = make_pair(T[i],S[i]);
if(top < p){
sec = top;
top = p;
}
else if(sec < p){
sec = p;
}
}
cout << sec.second << endl;
}
posted:
last update:
