#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<memory.h>
#include<math.h>
using namespace std;
const int INF = 0x3fffffff;
const int maxn = 5010;
const double eps = 1e-9;
const double PI = acos(-1);
typedef struct{double x,y;}pos;
typedef struct{double k,b;} line;
typedef struct{pos c;double r;} cir;
double pf(double x){return x*x;}
pos operator +(pos a,pos b){return {a.x+b.x,a.y+b.y};}
pos operator -(pos a,pos b){return {a.x-b.x,a.y-b.y};}
double operator *(pos a,pos b){return a.x * b.y - a.y * b.x;}
double operator &(pos a,pos b){return a.x * b.x + a.y * b.y;}
double area(pos a,pos b,pos c){return (b - a) * (c - a) / 2;}
double get_dist(pos a,pos b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
bool in_cir(pos a,cir b){return get_dist(a,b.c) < b.r;}
double length(pos a){return sqrt(a.x*a.x+a.y*a.y);}
double line_pos(pos a,pos b,pos c){double s = fabs(area(a,b,c));return s * 2 / get_dist(b,c);}//a到b---c
line get_line(pos a,pos b){line np;np.k = (b.y-a.y)/(b.x-a.x+eps);np.b = a.y - np.k * a.x;return np;}
double get_angle(pos a,pos b){return acos(((a & b)) / (length(a) * length(b)));}
int n;
double x=0,y=0,p;
pos pl[maxn];
double tri_bisect(pos a,pos b,double rad){
cir np = (cir){{x,y},rad};
double f = 0;
if(area(a,b,{x,y})>=0) f = 1;
else f = -1;
if(in_cir(a,np)&&in_cir(b,np)){return fabs(area({x,y},a,b)) * f;}
else if(fabs(a*b)==0) return 0;
else if(in_cir(a,np)&&!in_cir(b,np)){
line tp = get_line(a,b);double k = tp.k,bb = tp.b;
double del = sqrt(pf(2*(bb*k-y*k-x)) - 4*(pf(k)+1)*(pf(x)+pf(y)+pf(bb)-2*bb*y-pf(rad)));
double x1 = (-2*(bb*k-y*k-x) + del) / (k*k+1) / 2;
double x2 = (-2*(bb*k-y*k-x) - del) / (k*k+1) / 2;
if((a.x<=x1&&x1<=b.x)||(a.x>=x1&&x1>=b.x)){
double y1 = k*x1 + bb;
double ang = get_angle((pos){b.x-x,b.y-y},(pos){x1-x,y1-y}) / PI * 180.0;
return fabs(rad * rad * PI * ang / 360) * f + fabs(area((pos){x1,y1},a,(pos){x,y})) * f;
}
else if((a.x<=x2&&x2<=b.x)||(a.x>=x2&&x2>=b.x)){
double y2 = k*x2 + bb;
pos p1 = b - (pos){x,y},p2 = (pos){x2,y2} - (pos){x,y};
double ang = get_angle(p1,p2) / PI * 180.0;
return fabs(rad * rad * PI * ang / 360) * f + fabs(area((pos){x2,y2},a,(pos){x,y})) * f;
}
}else if(in_cir(b,np)&&!in_cir(a,np)){
line tp = get_line(a,b);double k = tp.k,bb = tp.b;
double del = sqrt(pf(2*(bb*k-y*k-x)) - 4*(pf(k)+1)*(pf(x)+pf(y)+pf(bb)-2*bb*y-pf(rad)));
double x1 = (-2*(bb*k-y*k-x) + del) / (k*k+1) / 2;
double x2 = (-2*(bb*k-y*k-x) - del) / (k*k+1) / 2;
if((a.x<=x1&&x1<=b.x)||(a.x>=x1&&x1>=b.x)){
double y1 = k*x1 + bb;
double ang = get_angle((pos){a.x-x,a.y-y},(pos){x1-x,y1-y}) / PI * 180.0;
return fabs(rad * rad * PI * ang / 360) * f + fabs(area((pos){x1,y1},b,{x,y})) * f;
}
else if((a.x<=x2&&x2<=b.x)||(a.x>=x2&&x2>=b.x)){
double y2 = k*x2 + bb;
double ang = get_angle((pos){a.x-x,a.y-y},(pos){x2-x,y2-y}) / PI * 180.0;
return fabs(rad * rad * PI * ang / 360) * f + fabs(area((pos){x2,y2},b,(pos){x,y})) * f;
}
}else{
line tp = get_line(a,b);double k = tp.k,bb = tp.b;
double del = sqrt(pf(2*(bb*k-y*k-x)) - 4*(pf(k)+1)*(pf(x)+pf(y)+pf(bb)-2*bb*y-pf(rad)));
double x1 = (-2*(bb*k-y*k-x) + del) / (k*k+1) / 2;
double x2 = (-2*(bb*k-y*k-x) - del) / (k*k+1) / 2;
if(line_pos({x,y},a,b)>=rad||(!(min(a.x,b.x)<=x1&&x1<=max(a.x,b.x))&&!(min(a.x,b.x)<=x2&&x2<=max(a.x,b.x)))){
double ang = get_angle({a.x-x,a.y-y},(pos){b.x-x,b.y-y}) / PI * 180.0;
return fabs(rad * rad * PI * ang / 360) * f;
}else{
line tp = get_line(a,b);double k = tp.k,bb = tp.b;
double del = sqrt(pf(2*(bb*k-y*k-x)) - 4*(pf(k)+1)*(pf(x)+pf(y)+pf(bb)-2*bb*y-pf(rad)));
double x1 = (-2*(bb*k-y*k-x) + del) / (k*k+1) / 2;
double x2 = (-2*(bb*k-y*k-x) - del) / (k*k+1) / 2;
double y1 = k*x1 + bb,y2 = k*x2 + bb;
pos a1 = {x1,y1},a2 = {x2,y2};
double ang1 = get_angle({a.x-x,a.y-y},{x1-x,y1-y})/ PI * 180.0;
double ang3 = get_angle({a.x-x,a.y-y},{x2-x,y2-y})/ PI * 180.0;
double ang2 = get_angle({b.x-x,b.y-y},{x2-x,y2-y})/ PI * 180.0;
double ang4 = get_angle({b.x-x,b.y-y},{x1-x,y1-y})/ PI * 180.0;
if(ang3 + ang4 > ang1 + ang2) return fabs(rad * rad * PI * ang1 / 360) * f + fabs(rad * rad * PI * ang2 / 360) * f+fabs(area(a1,a2,{x,y}))*f;
else return fabs(rad * rad * PI * ang3 / 360) * f + fabs(rad * rad * PI * ang4 / 360) * f+fabs(area(a1,a2,{x,y}))*f;
}
}
}
bool check(double tot,double mid){
double ret = 0;
for(int i = 1 ; i <= n ; i ++){
ret += tri_bisect(pl[i],pl[i%n+1],mid);
}ret = fabs(ret);
if(p*tot/100>ret)return true;
else return false;
}
signed int main(){
freopen("testdata.in","r",stdin);
int T,kase=0;scanf("%d",&T);
while(T--&&++kase){
double mxd = -1,are = 0;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++) scanf("%lf%lf",&pl[i].x,&pl[i].y);
scanf("%lf%lf%lf",&x,&y,&p);
for(int i = 1 ; i <= n ; i ++) are += (pl[i].x * pl[i%n+1].y - pl[i].y * pl[i%n+1].x) / 2,mxd = max(get_dist(pl[i],{x,y}),mxd);
double l = 0,r = 10000;int t = 0;
while(r - l > 1e-4){
double mid = (l + r) / 2;
if(check(are,mid)) l = mid;
else r = mid;
}
printf("Case %d: %d\n",kase,(int)(round(r)));
}
return 0;
}
悬赏关注!
是UVa11978这道题,udebug 上的数据过了