割り算するのが怖いからccw
typedef complex<double> Point; double cross(Point a, Point b) { return (a.real() * b.imag() - a.imag() * b.real()); } double dot(Point a, Point b) { return (a.real() * b.real() + a.imag() * b.imag()); } namespace CCW{ enum{ RIGHT = 1, LEFT = -1, FRONT = 2, BACK = 2, OTHER = 0 }; }; int ccw(Point a, Point b, Point c) { b -= a; c -= a; if( cross(b, c) < 0 )return CCW::RIGHT; if( cross(b, c) > 0 )return CCW::LEFT; if( dot(b, c) < 0 )return CCW::BACK; if( norm(b) < norm(c) )return CCW::FRONT; return CCW::OTHER; } class BestView { public: int numberOfBuildings(vector <int> hs) { const int N = hs.size(); if (N == 1) return 0; if (N == 2) return 1; vector<Point> ps; for (int i = 0; i < N; ++i) { ps.push_back(Point(i, hs[i])); } int mx = 0; for (int i = 0; i < N; ++i) { int cnt = 0; if (i) ++cnt; for (int j = 0; j < i - 1; ++j) { bool flg = true; for (int k = j + 1; k < i; ++k) { flg = flg && ccw(ps[j], ps[i], ps[k]) == CCW::RIGHT; } if (flg) ++cnt; } if (i + 1 < N) ++cnt; for (int j = i + 2; j < N; ++j) { bool flg = true; for (int k = i + 1; k < j; ++k) { flg = flg && ccw(ps[i], ps[j], ps[k]) == CCW::RIGHT; } if (flg) ++cnt; } mx = max(mx, cnt); } return mx; } };