1. 程式人生 > 實用技巧 >三分題解

三分題解

為啥要寫這麼簡單題的題解呢?因為讓我想起了團隊裡的一道題,直到今天我才知道那道題的做法

廢話不多說,我們可以發現,要求的就是最遠的距離,我們把玻璃看成旋轉橡皮擦,或者是說我們可以通過旋轉比較在每一個方向上兩兩的距離來找他的直徑()

那麼我旋轉180度,只會有一個點是最大的,並且這個是一個單調的過程(我也不知道怎麼證明,玩兩下就知道了)

那麼我們就可以寫一個三分,程式碼如下:

#include <cstdio>
#include <cmath>

const double pi=acos(-1.0);

using namespace std;

int n,m;

double a[1000010],b[1000010];

double h(double x)
{
  double max1,max2,maxn=0;
  for(int i=1;i<=m;i++)
  {
    for(int j=i+1;j<=m;j++)
    {
      max1=fabs((a[i]-a[j])*sin(x)-(b[i]-b[j])*cos(x));
      max2=fabs((a[i]-a[j])*cos(x)+(b[i]-b[j])*sin(x));
      if(max1>maxn) maxn=max1;
      if(max2>maxn) maxn=max2;
    }
  }
  return maxn;
}

int main()
{
  scanf("%d",&n);
  while(n--)
  {
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
      scanf("%lf%lf",&a[i],&b[i]);
    }
    double l=0.0,r=pi;
    while(r-l>1e-9)
    {
      double mid=(l+r)/2;
      double rmid=(mid+r)/2;
      if(h(mid)>h(rmid)) l=mid;
      else r=rmid;
    }
    double ans=h(l);
    printf("%.2f\n",ans*ans);
  }
}

至於團隊中的題,也許是這個的加強版吧