题目:在直角坐标系中给定 p1,p2,p3构成三角形,给定p4可能在三角形边上也可能不在,

问能不能在三角形上找出p5,使得线段p4p5,平分三角形(p4必须在三角形上)。不能则输出-1.

思路:四个点,三条边,三条边的长度,和代码的数据一一对应存储。

①:不在三角形上

②:在三角形上

  ①在顶点上(两条线段上)

  ②不在顶点上(一条线段上)

    ①在中点

    ②不在中点

最麻烦的就是p4只存在于一条边上。

代码:

 #include<bits/stdc++.h>
using namespace std; const double eps = 1e-;
int sgn(double x)
{
if(fabs(x) < eps)return ;
if(x < )return -;
else return ;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y)
{
x = _x;y = _y;
}
Point operator -(const Point &b)const
{
return Point(x - b.x,y - b.y);
} double operator ^(const Point &b)const//叉积
{
return x*b.y - y*b.x;
} double operator *(const Point &b)const//点积
{
return x*b.x + y*b.y;
}
void transXY(double B)//绕原点旋转角度B(弧度值),后x,y的变化
{
double tx = x,ty = y;
x = tx*cos(B) - ty*sin(B);
y = tx*sin(B) + ty*cos(B);
}
void read(double a,double b){
x = a; y = b;
}
};
struct Line
{
Point s,e;
Line(){}
Line(Point _s,Point _e)
{
s = _s;e = _e;
}
pair<int,Point> operator &(const Line &b)const
{
//两直线相交求交点
//第一个值为0表示直线重合,为1表示平行,为0表示相交,为2是相交
//只有第一个值为2时,交点才有意义
Point res = s;
if(sgn((s-e)^(b.s-b.e)) == )
{
if(sgn((s-b.e)^(b.s-b.e)) == )
return make_pair(,res);//重合
else return make_pair(,res);//平行
}
double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
res.x += (e.x-s.x)*t;
res.y += (e.y-s.y)*t;
return make_pair(,res);
}
void read(Point& a,Point& b){
s.x = a.x;
s.y = a.y;
e.x = b.x;
e.y = b.y;
}
};
bool OnSeg(Point& P,Line& L)//判断点在线段上
{
return
sgn((L.s-P)^(L.e-P)) == &&
sgn((P.x - L.s.x) * (P.x - L.e.x)) <= &&
sgn((P.y - L.s.y) * (P.y - L.e.y)) <= ;
}
//线长
inline double get_Ldis(Line& L){
return sqrt((L.s.x-L.e.x)*(L.s.x-L.e.x)+(L.s.y-L.e.y)*(L.s.y-L.e.y));
}
//两点长
inline double get_pdis(Point& a,Point& b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} inline void print(Line& L){
printf("%.12f %.12f\n",(L.s.x+L.e.x)/,(L.s.y+L.e.y)/);
} inline double fun(double n,double x1,double x2,double d){
return n*(x1-x2)/d + x2;
}
Point p[]; Line L[]; double d[];
inline void solve(Line& l,double m1,double m2,Point& p1,Point& p2,Point& p3,double d1,double d2,double d3){ double n;
double x,y;
if(m1==m2) {printf("%.12f %.12f\n",p1.x,p1.y); return;}
else if( m1 > m2){
n = (d1*d2)/(*m1);
x = fun(n,p1.x,p2.x,d1);
y = fun(n,p1.y,p2.y,d1);
}
else{
n = (d2*d3)/(*m2);
x = fun(n,p1.x,p3.x,d3);
y = fun(n,p1.y,p3.y,d3);
}
printf("%.12f %.12f\n",x,y);
} int main()
{ int T;
double m1,m2;
scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p[].x,&p[].y,&p[].x,&p[].y,&p[].x,&p[].y,&p[].x,&p[].y);
L[].read(p[],p[]); L[].read(p[],p[]); L[].read(p[],p[]);
for(int i = ; i <= ; ++i) d[i] = get_Ldis(L[i]); if(OnSeg(p[],L[]) || OnSeg(p[],L[]) || OnSeg(p[],L[])){
if(OnSeg(p[],L[]) && OnSeg(p[],L[])){
print(L[]); continue;
}
if(OnSeg(p[],L[]) && OnSeg(p[],L[])){
print(L[]);continue;
}
if(OnSeg(p[],L[]) && OnSeg(p[],L[])){
print(L[]);continue;
}
if(OnSeg(p[],L[])){
m1 = get_pdis(p[],p[]);
m2 = d[] - m1;
solve(L[],m1,m2,p[],p[],p[],d[],d[],d[]);
continue;
}
if(OnSeg(p[],L[])){
m1 = get_pdis(p[],p[]);
m2 = d[] - m1;
solve(L[],m1,m2,p[],p[],p[],d[],d[],d[]);
continue;
}
if(OnSeg(p[],L[])){
m1 = get_pdis(p[],p[]);
m2 = d[] - m1;
solve(L[],m1,m2,p[],p[],p[],d[],d[],d[]);
continue;
}
printf("-1\n");
}
else printf("-1\n");
} return ;
}

2019 ICPC Asia Nanjing Regional K. Triangle的更多相关文章

  1. 2019 ICPC Asia Nanjing Regional

    2019 ICPC Asia Nanjing Regional A - Hard Problem 计蒜客 - 42395 若 n = 10,可以先取:6,7,8,9,10.然后随便从1,2,3,4,5 ...

  2. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  3. The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph

    H题意: 给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和. 你要输出这k棵子树的权值中那个最大的.你需要让 ...

  4. 2019 ICPC Asia Taipei-Hsinchu Regional Problem K Length of Bundle Rope (贪心,优先队列)

    题意:有\(n\)堆物品,每次可以将两堆捆成一堆,新堆长度等于两个之和,每次消耗两个堆长度之和的长度,求最小消耗使所有物品捆成一堆. 题解:贪心的话,每次选两个长度最小的来捆,这样的消耗一定是最小的, ...

  5. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  6. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  7. Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流

    题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...

  8. Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈

    题面 题意:一堆有n个石子,编号从1⋯N排成一列,两个人Adrien 和Austin玩游戏,每次可以取1⋯K个连续编号的石子,Adrien先手,谁不能取了则输 题解:k==1时,显然和n奇偶相关,当k ...

  9. 2019 ICPC Asia Xuzhou Regional

    目录 Contest Info Solutions A. Cat B. Cats line up C. <3 numbers E. Multiply F. The Answer to the U ...

随机推荐

  1. Xbim.GLTF源码解析(一):简介

    原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10838972.html 简介 Xbim.GLTF是将IFC文件转换成GLTF文件的一个 ...

  2. Docker安装ElasticSearch 以及使用LogStash实现索引库和数据库同步

    1:下载 ElasticSearch 镜像 docker pull docker.io/elasticsearch:5.6.8 2:创建 ElasticSearch 容器: 注意:5.0默认分配jvm ...

  3. Mysql用户管理及权限分配

    早上到公司,在服务器上Mysql的数据库里新建了个database,然后本地的系统里用原来连接Mysql账号admin连这个数据库.结果报错了,大概是这样子的: Access denied for u ...

  4. 学习笔记42_SpringMVC

    SpringMVC中,Global.axas发生变化,其中 1.原来是 public class MvcApplication:System.web.HttpApplication 现在是 publi ...

  5. CSPS模拟 91

    T1 sz最多根号种 T2 没计算内存,水过了..CSPS这样的话要爆零的qaq T3 感谢miku带我重学ST表%%%%%

  6. Maven配置setting.xml详细说明

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  7. java.io.StreamCorruptedException: invalid stream header: 00000000

    Caused by: java.io.StreamCorruptedException: invalid stream header: 00000000 at java.io.ObjectInputS ...

  8. CSP-S 46 题解

    改完题了,就稍写一下题解,顺便反思一下! 其实这次考试挺水的,然而我也挺水的,看了考试结束后的成绩,就吃-*了! T1 set 这个我考试的时候实在是没有想到如何去判断-1,然后我就觉得这神仙题没法解 ...

  9. 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

  10. 2、linux基础-面试题

    自己写的答案 1.1GB 2.4 3.ubuntu.dbian.Fedora 4.系统.硬件.clock -w 5.文件 6.uname -a 7.centos是redhat的社区版,redhat是商 ...