题目链接: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; } }