| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:先预处理出大概1000多个极值点,然后枚举极值点和公切线,可能会快一点In Reply To:先预处理出大概1000多个极值点,然后枚举极值点和公切线,可能会快一点 Posted by:Los_Angelos_Laycurse at 2012-03-29 22:15:51 > rt
贴代码
Source Code
Problem: 3011 User: Los_Angelos_Laycurse
Memory: 368K Time: 3375MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<map>
using namespace std;
double ans1,ans2,arg1,arg2,eps=1e-10,arg[100000],value,ta,ax,pi=acos(-1.000);
double res1[10000],res2[10000];
struct segment
{
double b1,b2;
bool operator <(const segment &temp)const
{
return b1<temp.b1;
}
};
segment seg[20000];
struct point
{
double x,y;
};
point a[111];
int cnt,ncnt;
int gcd(int a,int b)
{
int temp;
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
int main()
{
int n,i,j,s,p,q,id,tst=0;
cnt=0;
for(i=-30;i<=30;i++)
for(j=0;j<=30;j++)
{
if(gcd(abs(i),abs(j))>1)
continue;
if(j==0)
arg[cnt++]=pi/2;
else
{
arg[cnt]=atan((double)i/(double)j);
if(arg[cnt]<0)
arg[cnt]+=pi;
cnt++;
}
}
while(scanf("%d",&n)&&n!=0)
{
for(i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
ncnt=cnt;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i].x==a[j].x)
arg[ncnt]=pi/2.00;
else
{
arg[ncnt]=atan((a[i].y-a[j].y)/(a[i].x-a[j].x));
if(arg[ncnt]<0)
arg[ncnt]+=pi;
arg[ncnt]=pi-arg[ncnt];
}
ncnt++;
double x0=(a[i].x+a[j].x)/2.00,y0=(a[i].y+a[j].y)/2.00,dist;
dist=sqrt((x0-a[j].x)*(x0-a[j].x)+(y0-a[j].y)*(y0-a[j].y));
if(dist<1.00)
dist=1.00;
double theta1=asin(1.000/dist),theta2,theta;
if(a[i].x==a[j].x)
theta2=pi/2.00;
else
theta2=atan((a[i].y-a[j].y)/(a[i].x-a[j].x));
if(theta2<0)
theta2+=pi;
theta=theta1+theta2;
if(theta>pi)
theta-=pi;
theta=pi-theta;
arg[ncnt++]=theta;
theta=theta2-theta1;
if(theta<0)
theta+=pi;
theta=pi-theta;
arg[ncnt++]=theta;
}
ans1=0;
ans2=1000000000;
for(i=0;i<ncnt;i++)
{
double v1;
ta=tan(pi-arg[i]);
v1=sqrt(1+ta*ta);
for(j=0;j<n;j++)
{
double b=a[j].y-ta*a[j].x;
seg[j].b1=b-v1;
seg[j].b2=b+v1;
}
sort(seg,seg+n);
ax=seg[0].b2;
value=id=0;
for(j=1;j<n;j++)
{
if(seg[j].b1>ax)
{
value+=(ax-seg[id].b1)/v1;
id=j;
}
if(seg[j].b2>ax)
ax=seg[j].b2;
}
value+=(ax-seg[id].b1)/v1;
if(ans1<value)
{
ans1=value;
arg1=arg[i];
}
if(ans2>value)
{
ans2=value;
arg2=arg[i];
}
}
res1[tst]=arg2;
res2[tst++]=arg1;
}
for(i=0;i<tst;i++)
printf("%.20lf\n%.20lf\n",res1[i],res2[i]);
//system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator