Official

B - 最寄りの郵便局 / Nearest Post Office Editorial by kyopro_friends Editorial for printing


「座標 \(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)

posted:
last update: