7.1.1 HDU2108 Shape of HDU
判断凸多边形,每连续三个点之间求叉积判断即可
7.1.2 HDU1086 You can Solve a Geometry Problem too
判断线段相交,模板题,参考吉大模板
7.1.3 HDU1115 Lifting the Stone
多边形重心,模板题,参考吉大模板
7.1.4 HDU1392 Surround the Trees
凸包,计算周长
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct point{
double x,y;
}pnt[110],res[110];
int n,ind;
//小于0,说明P0P1>P0P2(极角)
double mult(point p0,point p1,point p2){
return (p2.y-p0.y)*(p1.x-p0.x)-(p1.y-p0.y)*(p2.x-p0.x);
}
double dis(point px,point py){
return sqrt((py.y-px.y)*(py.y-px.y)+(py.x-px.x)*(py.x-px.x));
}
bool cmp(const point &a,const point &b){
double t=mult(pnt[0],a,b);
if(t!=0)return t>0;
return dis(pnt[0],a)
7.1.5 HDU1577 WisKey的眼神
当直角三角形两直角边互质时,斜边不会经过其它整点(通过相似三角形可以证明)
gcd(fabs(sx-px),fabs(sy-py))==1?"Yes\n":"No\n"
7.1.6 HDU1147 Pick-up sticks
o(n^2)的枚举,理论超时却能过这题,数据弱?还是break的作用使实际复杂度低于O(n^2)?
#include
#include
#define INF 1e20
#define eps 1e-10
#define MAXN 100010
using namespace std;
struct point{double x,y;};
struct line{point a,b;int top;}l[MAXN];
int n;
double xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cross(line u,line v){
return ((max(u.a.x,u.b.x)>=min(v.a.x,v.b.x))&&
(max(v.a.x,v.b.x)>=min(u.a.x,u.b.x))&&
(max(u.a.y,u.b.y)>=min(v.a.y,v.b.y))&&
(max(v.a.y,v.b.y)>=min(u.a.y,u.b.y))&&
(xmult(v.a,u.b,u.a)*xmult(u.b,v.b,u.a)>=0)&&
(xmult(u.a,v.b,v.a)*xmult(v.b,u.b,v.a)>=0));
}
int main(){
while(scanf("%d",&n),n){
for(int i=0;i
7.1.7 HDU2215 Maple trees
求最大外接圆,先求出凸包上的点,再每次枚举三个点,当钝角三角形时,r=最大边/2,否则r=c/(2sin(a,b))=a*b*c/(2(axb)).求出最大R即可
7.1.8 HDU2202 最大三角形
模板凸包,然后枚举凸包上的三点即可求叉积即可