1 条题解

  • 0
    @ 2025-4-15 19:16:08

    算法标签:

    计算几何

    题解:

    这是道计算几何的简单题,只要以每一个与圆心距离小于等于圆半径的点和圆心构成半圆的直径线,然后找在直径右侧且距圆心距离小于等于圆的半径的点的个数,记录最大值就行了。

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    const double eps = 1e-8;
    
    // 自定义绝对值函数
    double abs(double a) {
        if (a < 0)
            return -a;
        return a;
    }
    
    // 点的结构体
    struct Point {
        int x, y;
    };
    
    Point circle;
    Point p[200];
    double r;
    
    // 计算两点之间的距离
    double distance(Point p1, Point p2) {
        double x = double(p1.x - p2.x);
        double y = double(p1.y - p2.y);
        return sqrt(x * x + y * y);
    }
    
    // 计算向量 cp1 和 cp2 的叉积
    int mul(Point p1, Point p2, Point c) {
        return (p1.x - c.x) * (p2.y - c.y) - (p1.y - c.y) * (p2.x - c.x);
    }
    
    int main() {
        int n, i, j;
        while (cin >> circle.x >> circle.y >> r && r > -eps) {
            int max = 0;
            cin >> n;
            for (i = 0; i < n; i++)
                cin >> p[i].x >> p[i].y;
            for (i = 0; i < n; i++)
                if (distance(p[i], circle) - r < eps) {  // 枚举构成半圆直径的另一个点
                    int cnt = 1;
                    for (j = 0; j < n; j++) {
                        if (j == i)
                            continue;
                        if (distance(p[j], circle) - r < eps && mul(p[i], p[j], circle) >= 0) {  // 只要判断一个方向
                            cnt++;
                        }
                    }
                    if (cnt > max)
                        max = cnt;
                }
            cout << max << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    107
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者