三分 --- POJ 3301 Texas Trip

简介: Texas Trip Problem's Link:   http://poj.org/problem?id=3301   Mean:  给定n(n

 Texas Trip

Problem's Link:   http://poj.org/problem?id=3301


 

Mean: 

给定n(n <= 30)个点,求出包含这些点的面积最小的正方形的面积。

 

analyse:

首先要确定的是旋转的角度在0到180度之间即可,超过180度是和前面的相同的。

坐标轴旋转后,坐标变换为:

 

X’ = x * cosa - y * sina;
y’ = y * cosa + x * sina;

 

 

 

Time complexity: O(n)

 

Source code: 

 

//  Memory   Time
//  1347K     0MS
//   by : crazyacking
//   2015-03-31-22.18
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<iostream>
#include<algorithm>
#define MAXN 1000010
#define LL long long
using namespace std;
#define eps 1e-12
#define INF (1<<25)

double ppx[40],ppy[40];
int n;

double  Cal(double a)
{
    double xMin=INF*1.0,yMin=INF*1.0,xMax=-INF*1.0,yMax=-INF*1.0;

    for(int i=1;i<=n;i++)
    {
        double x1=ppx[i]*cos(a)-ppy[i]*sin(a);
        double y1=ppx[i]*sin(a)+ppy[i]*cos(a);

        if(x1>xMax)
            xMax=x1;
        if(x1<xMin)
            xMin=x1;

        if(y1>yMax)
            yMax=y1;
        if(y1<yMin)
            yMin=y1;
    }
    if(xMax-xMin<yMax-yMin)
        return yMax-yMin;
    else
        return xMax-xMin;

}

int main()
{
    int t;
    int x,y;

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            ppx[i]=x+500.0;
            ppy[i]=y+500.0;
        }
        double le=0,ri=PI,mid,mmid;
        double mid_va,mmid_va;

        while(le+eps<=ri)
        {
            mid=(le+ri)/2;
            mmid=(mid+ri)/2;
            mid_va=Cal(mid);
            mmid_va=Cal(mmid);
            if(mid_va<mmid_va)
                ri=mmid;
            else
                le=mid;
        }
        printf("%.2lf\n",Cal(le)*Cal(le));
    }
    return 0;
}
View Code

 

 

 

目录
打赏
0
0
0
0
57
分享
相关文章
poj 3254 Corn Fields (状态压缩dp)
状态压缩dp其实就是用二进制来表示所有的状态,比如这题, 我们在某一行可以这样取0 1 0 1 1 0 1,用1代表取了,0代表没取,因为这点,它的数据量也限制在20以内,所有看到这样数据量的题目可以先考虑一下状态压缩dp。对于有多行的数据,所有状态的总数必然很庞大,而且不用特殊的方法想要存储这些状态是不太现实的。既然每个点只有这两种情况,我们可以用二进制的一位来表示,0 1 0 1 1 0 1就可以表示为二进制0101101也就是十进制的45,如果我们想要枚举6个点的所有状态,我们只需要从0到2^6取其二进制就可以了,并不会重复或是多余。
47 0
[POJ 3683] Priest John‘s Busiest Day | 2-SAT +Tarjan缩点跑拓扑排序
题意: 给出n个婚礼,每个婚礼有个开始的时间和结束的时间,在婚礼期间,要举行持续时间为D的活动,这个活动只能在婚礼期间的前D时间内举行,或者是在婚礼期间的后D时间内举行,问能否安排一种方式使得能够参与n个婚礼的活动 思路: 每个活动有两个选择,而且还要满足一定的条件,这显然是一个2-SAT问题 方法: 2-SAT + Tarjan 首先根据两种选择是否首尾冲突进行连边,如果冲突,则连对立的边
116 0
POJ 1306 Combinations
POJ 1306 Combinations
129 0
题解 P1339 【[USACO09OCT]热浪Heat Wave】
题目链接 这道题纯属是一个裸的SPFA;建议先把模板AC之后再做。只需要做一些手脚,就是在加边的时候加一个双向边就好。然后再第一次加点的时候看不懂模板的出门左转度娘。推荐下面一片讲解:友链所以说,直接上代码。
1157 0
POJ 1306 Combinations
Description Computing the exact number of ways that N things can be taken M at a time can be a great challenge when N and/or M become very large.
659 0
容斥 + 组合数学 ---Codeforces Round #317 A. Lengthening Sticks
  Lengthening Sticks Problem's Link:  http://codeforces.com/contest/571/problem/A   Mean:  给出a,b,c,l,要求a+x,b+y,c+z构成三角形,x...
961 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等