公式
B - 最寄りの郵便局 / Nearest Post Office 解説
by
B - 最寄りの郵便局 / Nearest Post Office 解説
by
kyopro_friends
「座標 \(x\) から最も近い郵便局の番号は?」は、線形走査により \(O(N)\) で求めることができるので、これを 2 回行うことで問題を解くことができます。
同じ処理を複数回行う場合は、関数化すると実装が簡潔になります。
計算量は \(O(N)\) になります。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, p, q;
cin >> n >> p >> q;
vector<pair<int,int>>xc(n);
for(int i=0; i<n; i++) cin >> xc[i].first >> xc[i].second;
auto find=[&](int x){
// 座標 x に最も近い郵便局の番号は?
int idx = 0;
for(int i=0; i<n; i++){
if( (abs(x - xc[i].first) < abs(x - xc[idx].first)) || (abs(x - xc[i].first) == abs(x - xc[idx].first) && xc[i].first < xc[idx].first) ){
idx = i;
}
}
return idx;
};
int pi = find(p);
int qi = find(q);
if(pi == qi){
cout << xc[pi].second + 2 << endl;
}else{
cout << xc[pi].second + xc[qi].second + 2 << endl;
}
}
実装例 (Python)
N, P, Q = map(int, input().split())
XC = []
for _ in range(N):
X, C = map(int, input().split())
XC.append((X, C))
def find(x):
# 座標 x に最も近い郵便局の番号は?
idx = 0
for i in range(N):
if (abs(x - XC[i][0]) < abs(x - XC[idx][0])) or (abs(x - XC[i][0]) == abs(x - XC[idx][0]) and XC[i][0] < XC[idx][0]):
idx = i
return idx
pi = find(P)
qi = find(Q)
if pi == qi:
print(XC[pi][1] + 2)
else:
print(XC[pi][1] + XC[qi][1] + 2)
