poj3301

参考三分讲解。

http://hi.baidu.com/czyuan_acm/item/81b21d1910ea729c99ce33db

#include <iostream>
#include <algorithm>
#include <math.h>
#include <iomanip>

using namespace std;

#define pi acos(-1.0)
#define eps 1e-8
#define INF 1<<30

struct point{ int x, y; }p[35];
int n, t;

double calc(double angle)
{
    double xmax, xmin, ymax, ymin, y, x;
    xmax = ymax = -INF;
    xmin = ymin = INF;
    for (int i = 0; i < n; i++)//rotate
    {
        x = cos(angle)*p[i].x - sin(angle)*p[i].y;
        y = sin(angle)*p[i].x + cos(angle)*p[i].y;
        xmax = max(xmax, x);
        xmin = min(xmin, x);
        ymax = max(ymax, y);
        ymin = min(ymin, y);
    }
    return max(xmax - xmin, ymax - ymin);
}
void solve()
{
    double low = 0, high = pi/4, mid, midmid;
    while (fabs(high - low) > eps)// the process
    {
        mid = (high + low) / 2;
        midmid = (mid + high) / 2;
        if (calc(mid) <= calc(midmid))
            high = midmid;
        else low = mid;
    }
    double ans = calc(mid);
    cout << fixed << setprecision(2) << ans * ans << endl;
}
int main()
{
    cin >> t;
    while (t--)
    {
        memset(p, 0sizeof(p));
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cin >> p[i].x >> p[i].y;
        }
        solve();
    }
    return 0;
}

你可能感兴趣的:(数学,计算几何学,ACM题解报告)