【競プロ精進ログ】ABC133-B

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC133-B「Good Distance」です。

ポイント

多重配列と多重forループを利用して貪欲に調べ上げる練習です。平方数になっているかのチェックは,その数までの整数に関して調べれば十分です。(例えば16が平方数かどうかを調べるためには1から16までの整数を二乗して16と等しくなるかを調べていきます。もし見つかればすぐbreakしてOKです。)

おさえるべき内容

 多重配列と多重forループを使いこなす

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;

int main(){
  int N, D, ans=0;
  cin >> N >> D;
  vector<vector<int>> X(N, vector<int>(D));
  rep(i, N){
    rep(j, D){
      cin >> X[i][j];
    }
  }

  // ここからソルバー
  // とりあえず全ての組み合わせを試していく
  rep(i, N){
    repi(j, i+1, N){
      int length = 0;
      // 各要素ごとに二乗誤差を測る
      rep(k, D){
        int diff = abs(X[i][k] - X[j][k]);
        length += diff * diff;
      }
      // 平方数になっているかの判断
      // lengthが1のときに備えて範囲は0からlength+1まで
      bool flag = false;
      rep(l, length+1){
        // もし平方数であればflagをtrueに
        if (l*l==length){
          flag = true;
          break;
        }
      }
    // 平方数であればansをインクリメント
    if (flag) ans++;
    }
  }
  // 出力
  cout << ans << endl;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる