SRM449 div1 easy
こーどが余りきれいではないけれど、とりあえず、誤差に注意する.
X*X = a*a + b*bのとき、 aの値がわかれば、 b = sqrt(X*X - b*b)でわかる。
#define INF (1 << 30) #define eps (1e-9) #define X first #define Y second using namespace std; typedef pair<int, int> pii; typedef pair<int, int> Dot; typedef long long LL; vector<Dot> solve(int num) { vector<Dot> ans; for(int i = (int)sqrt(num/2 + 0.5); i <= (int)sqrt(num + 0.5)+1; i++) { double tmp = sqrt(num - i*i) - (int)sqrt(num - i*i + 0.5); if(fabs(tmp) < eps) { ans.push_back( Dot(i, (int)sqrt(num-i*i+0.5)) ); } } return ans; } class MaxTriangle { public: double calculateArea(int A, int B) { vector<Dot> dotA = solve(A); vector<Dot> dotB = solve(B); if(dotA.size() == 0 || dotB.size() == 0) { return -1; } double maxi = 0; for(int i = 0; i < dotA.size(); i++) { for(int j = 0; j < dotB.size(); j++) { double arg = fabs( atan2(dotA[i].Y, dotA[i].X) - atan2(dotB[j].Y, dotB[j].X) ); maxi = max( maxi, 0.5*sqrt(A)*sqrt(B)*max(sin(arg), sin(arg+M_PI_2)) ); } } return maxi; }