共线点

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

 

上一篇:1034:计算三角形面积


下一篇:2021-01-02