就是说一个三角形。。2条边长的平方分别为A和B。。都小于2*10^9 并且这个三角形三个顶点的坐标都是整数。。求最大可能的面积或者没有这样的三角形返回-1.。
首先变长知道了。。那么这个三角形的夹角越接近90越好。。那么只要算出所有可能的角度然后扫描过去就可以了。。。
好烦啊。。程序很长很猥琐。。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack> a
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <complex>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <cctype>
using namespace std;
typedef long long ll;
const int maxn=2000000000;
vector<ll> S;
void predo()
{
for(ll i=0;i*i<maxn;i++)
S.push_back(i*i);
}
int inS(int x)
{
int i=lower_bound(S.begin(),S.end(),x)-S.begin();
if(S[i]==x) return i;
return -1;
}
class MaxTriangle
{
vector<double> put(int A)
{
vector<double>res;
double p=acos(0);
for(int i=0;i<S.size()&&S[i]<=A;i++)
{
int B=A-S[i];
int t=inS(B);if(t==-1) continue;
double a=atan2(i,t);
res.push_back(a);
res.push_back(a+p);
}
return res;
}
public:
double calculateArea(int A, int B)
{
predo();double p=acos(0);
vector<double> a=put(A),b=put(B);
sort(a.begin(),a.end());sort(b.begin(),b.end());
if(a.size()==0||b.size()==0) return -1;
double best=0;
for(int j=0,i=0;i<a.size()&&a[i]<=p;i++)
{
while(b[j]-a[i]<p&&j!=b.size()-1)j++;
double q=b[j]-a[i];
if(abs(q-p)<abs(best-p)) best=q;
if(j)j–;
if(abs(q-p)<abs(best-p)) best=q;
}
return sin(best)*sqrt(A)*sqrt(B)/2;
}
};