ゆとりーなの日記

日記的な事を書いて行くと思はれる

最強最速アルゴリズマー養成講座が難しい(著者註:私にとって)

先輩方がICPCに熱いみたいなので自分もアルゴリズマー的なことやるよという雰囲気で最強最速アルゴリズマー養成講座:あなたの論理的思考とコーディング力は3倍高められる (2/2) - ITmedia エンタープライズにある問題に挑戦してみたのですがあっさり撃沈しました。著者のchokudai先生は「実装の検討で5分、コーディングが3分」とおっしゃっていましたが私はというと解説を読みながらでも実装の検討に数十分かかっております。アルゴリズマーへの道は遠いです。
以下ようやく出来たコードです。

#include <iostream>
#include <array>
#include <pstade/oven/algorithm.hpp>

// 気分的に構造体で
struct point {
  int x_;
  int y_;
};

struct circle {
  int x_;
  int y_;
  int r_;
};

bool check_inside(const point &p, const circle &c) {
  return (c.x_ - p.x_) * (c.x_ - p.x_) + (c.y_ - p.y_) * (c.y_ - p.y_) <= c.r_ * c.r_;
}

// 色んなコンテナに対応してみるなど
// 普通この手の問題でstd::array使えることはまずないと思うけど・・・
template <typename Array>
int least_borders(const point &begin, const point &end, const Array &v) {
  return pstade::oven::count_if(v, [begin, end](const circle &x) {
    return check_inside(begin, x) ^ check_inside(end, x);
  });
}

// テスト
int main() {
  // 図の座標はこれくらいだと受信
  const point begin = {30, 30};
  const point end = {70, 30};
  const std::array<circle, 6> v = {{
    {50, 50, 50}, {35, 30, 15}, {40, 35, 3}, {60, 70, 5}, {70, 30, 10}, {110, 10, 5}
  }};
  std::cout << least_borders(begin, end, v) << std::endl;
  return 0;
}
出力
2

これで大丈夫ですかね。コーディングは、まぁ数十分はかかってませんが3分以上はかかってます。