有一个坑点,就是给出的点共线。在加点的时候要判一下就行。剩下的就是半平面交。
有两种情况:瞭望塔的一个端点在半平面的交点上,另一端在山上。
或者一个端点在山上,另一个端点在半平面上。
由于 n < = 100 n<=100 n<=100,暴力枚举一下就行了。做半平面的时候我在两边加上了两条竖直边。充当边界。(好像不加也没啥问题)
调试的时候,可以把样例的图画出来,手玩坐标,然后看看自己程序里的坐标算对没有。这样大概可以精准查错。
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
const double inf=1e20;
const int maxn=1000;
int cnt=0,tot=0,n;double x[maxn],y[maxn],ans=inf;
inline int sgn(double x){
if(x>eps) return 1;
if(x<-eps) return -1;
return 0;
}
struct Grid{
double x,y;
Grid(double X=0,double Y=0){
x=X,y=Y;}
friend inline Grid operator+(const Grid &a,const Grid &b){
return Grid(a.x+b.x,a.y+b.y);}
friend inline Grid operator-(const Grid &a,const Grid &b){
return Grid(a.x-b.x,a.y-b.y);}
friend inline Grid operator*(const Grid &a,const double &b){
return Grid(a.x*b,a