ABC224 C - Triangle? C++解答例
AtCoder Beginner Contest 224 C - Triangle?をC++で解きます。
問題
問題文をAtCoderのサイトより引用します。
問題文
平面上に1から xy までの番号がついた N 個の点があります。 N
点は座標 i にあり、相異なる2点は異なる2点に存在します。 (X_i, Y_i)
この点から3点選ぶとき、選ばれた3点を線分で結んだ図形が正の面積を持つ三角形になるような点の選び方の総数を求めてください。 N
制約
- 入力はすべて整数である
3 \leq N \leq 300 -10^9 \leq X_i, Y_i \leq 10^9 ならば i \neq j (X_i, Y_i) \neq (X_j, Y_j)
解答例
選んだ3点が三角形を成さない条件
また、
3点が一直線上に並んでいるかどうかを判定するには、3点のうちの2点が成す直線上に残りの1点が存在するかどうかを判定すると良いでしょう。
このうち、2点
除算が絡むと誤差を考慮しなければならなくなり面倒なので、分母を払って次のように変形します。
この式の変数
実装例
実際のコードを示します。計算量は
尚、それぞれの辺の積で一番大きくなる値は
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main() {
int64_t N;
std::cin >> N;
std::vector<int64_t> x(N);
std::vector<int64_t> y(N);
for (int64_t i = 0; i < N; i++) {
std::cin >> x.at(i) >> y.at(i);
}
int64_t count = 0;
for (int64_t i = 0; i < N; i++) {
for (int64_t j = i + 1; j < N; j++) {
for (int64_t k = j + 1; k < N; k++) {
if ((y.at(k) - y.at(i)) * (x.at(j) - x.at(i)) == (y.at(j) - y.at(i)) * (x.at(k) - x.at(i))) {
continue;
} else {
count++;
}
}
}
}
std::cout << count << std::endl;
return 0;
}
実際に提出したコードはこちら。
Discussion