您的位置:首页 > 其它

2016夏季练习——三分

2016-07-15 16:55 239 查看
来源:POJ3301

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
const int MAXN = 35;
const double PI=acos(-1);
const double eps = 1e-8;
const double op = (sqrt(5)-1)/2;
const double INF = (~0U>>2);
struct Node{
double x,y;
};

Node p[MAXN];
Node rotate(Node p ,double rad){
Node pp;
pp.x=cos(rad)*p.x-sin(rad)*p.y;
pp.y=p.y*cos(rad)+p.x*sin(rad);
return pp;
}
/*inline double grad(double st,double en)
{
return st+op*(en-st);
}*/
double calc(double rad){
double minx=INF;
double miny=INF;
double maxx=-INF;
double maxy=-INF;
Node pp;
for(int i=0;i<n;i++){
pp=rotate(p[i],rad);
minx=min(minx,pp.x);
miny=min(miny,pp.y);
maxx=max(maxx,pp.x);
maxy=max(maxy,pp.y);
}
return max(maxx-minx,maxy-miny);
}
bool judge(double rad1,double rad2){
//cout<<"judge: "<<calc(rad1)<<" "<<calc(rad2)<<endl;
return calc(rad1)>calc(rad2);
}
int main(){
int T;
/*cout<<(~0U>>2)<<endl;
return 0;*/
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
//cout<<p[i].x<<" "<<p[i].y<<endl;
}
double left=0;
double right=PI/2;
double mid=(left+right)/2;
double midmid=(mid+right)/2;
while(abs(mid-midmid)>eps){
mid=(left+right)/2;
midmid=(right+mid)/2;
//cout<<left<<" "<<midmid<<" "<<mid<<" "<<right<<endl;
if(judge(mid,midmid)){
left=mid;
}
else{
right=midmid;
}
}
//cout<<"mid: "<<mid<<" "<<calc(mid)<<endl;
printf("%.2f\n",(calc(mid)*calc(mid)));
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: