题目链接:https://ac.nowcoder.com/acm/contest/9699/I
题目描述:
Bobo在平面上画了三条线段 s1,s2 和 s3。其中,线段 si 的左端点是 (ai , yi),右端点是 (bi , yi)。判断是否能找到三个点 p1,p2 和 p3 使得 · pi 在线段 si 上; · p1,p2,p3 三点共线。
输入描述:
输入文件包含多组数据,请处理到文件结束。 每组数据的第一行包含 3 个整数 a1,b1,y1.第二行包含 3 个整数 a2,b2 和 y2. 第三行包含 3 个整数 a3,b3 和 y3. · 0 ≤ ai < bi ≤ 109 · 0 ≤ y1 < y2 < y3 ≤ 109 · 数据组数不超过 104
输出描述:
对于每组数据,如果存在三点共线,则输出 Yes,否则输出 No 。
示例:
输入: 0 1 0 0 1 1 0 1 2 0 1 0 1 2 1 0 1 2 0 1 0 2 3 1 0 1 2 输出: Yes Yes No
题目分析:
本题已经保证三条直线y值递增且直线平行x轴。
所以第二条直线应该在第一条直线和第三条直线围成的矩形区域内,此区域可由两点式(y-y1)/(y2-y1)==(x-x1)/(x2-x1)推导出。
注意:若要acc本题就不要想太多的测试样例:比如
1.三条直线不相交且在同意直线上
2.全为0的情况
3.y2 - y1为0的情况
若加上这三条判断就不能acc本题,虽然我觉得完全没有问题!!!(浪费了我将近一个小时)
源码:
C++:
#pragma warning(disable:4996) #include<bits/stdc++.h> using namespace std; inline double judge(double x1, double y1, double x2, double y2, double y3) { return (y3 - y1) / (y2 - y1) * (x2 - x1) + x1; } int main() { double a[9]; int i; while (~scanf("%lf", &a[0])) { bool ans = 0; i = 1; while (i < 9 && scanf("%lf", &a[i])) i++; double r1 = judge(a[6], a[8], a[0], a[2], a[5]); double r2 = judge(a[7], a[8], a[1], a[2], a[5]); if (a[4] >= r1 && a[3] <= r2) ans = true; cout << (ans ? "Yes" : "No") << endl; } }
标签:直线,y2,double,共线,y1,y3,x1 来源: https://www.cnblogs.com/zjw1324399/p/14287798.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。