HDU_Steps7.1 几何入门 HDU2108 HDU1886 HDU1115 HDU1392 HDU1577 HDU1147 HDU2215 HDU2202

 

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 最大三角形

模板凸包,然后枚举凸包上的三点即可求叉积即可

你可能感兴趣的:(HDU_STEPS)