三分

#include<iostream>
#include<cmath>
#define EPS 1e-9
int cas,n;
int x[1000],y[1000];
using namespace std;
double calc(double d)
{
 int i,j;
 double dis1,dis2,dis;
 dis = 0.0;
 for(i=1;i<n;i++)
 {
  for(j=i+1;j<=n;j++)
  {
   dis1 = fabs(cos(d)*(y[i]-y[j])-sin(d)*(x[i]-x[j]));   //将一条线段在旋转坐标时沿X轴的长
   dis2 = fabs(sin(d)*(y[i]-y[j])+cos(d)*(x[i]-x[j]));    // 将一条线段在旋转坐标时沿y轴的长

   if(dis<dis1)
    dis = dis1;
   if(dis < dis2)
    dis = dis2;
  }
 }
 return (dis*dis);
}
int main()
{
 double l,r,mid,midmid;
 double s1,s2;
 cin>>cas;
 while(cas--)
 {
  cin>>n;
  for(int i=1;i<=n;i++)
   cin>>x[i]>>y[i];
  l = 0.0;
  r = acos(-1.0);
  while(r-l >= EPS)
  {
   mid = (l+r)/2;
      midmid = (mid+r)/2;
   s1 = calc(mid);
   s2 = calc(midmid);
   if(s1<s2)
    r = midmid;
   else
    l = mid;
  }
  printf("%0.2lf\n",s1<s2?s1:s2);
 }
 return 0;
}
//通式
  1. int SanFen(int l,int r) //找凸点  
  2. {  
  3.     while(l < r-1)  
  4.     {  
  5.         int mid  = (l+r)/2;  
  6.         int mmid = (mid+r)/2;  
  7.         if( f(mid) > f(mmid) )  
  8.             r = mmid;  
  9.         else  
  10.             l = mid;  
  11.     }  
  12.     return f(l) > f(r) ? l : r;  
  13. }  

猜你喜欢

转载自blog.csdn.net/acm160920007/article/details/76170514