50分WA求助
查看原帖
50分WA求助
1100788
CheeseFunction楼主2025/6/24 19:46

玄关求条QWQ

#include<bits/stdc++.h>
using namespace std;

const double EPS = 1e-9;

struct Pt {
    double x, y;
    Pt() : x(0), y(0) {}
    Pt(double x, double y) : x(x), y(y) {}
};

double sq(double x) { return x * x; }

double dst(const Pt& a, const Pt& b) {
    return sqrt(sq(a.x - b.x) + sq(a.y - b.y));
}

void cir_int(Pt A, double rA, Pt B, double rB, vector<Pt>& res) {
    double dx = B.x - A.x, dy = B.y - A.y;
    double d2 = sq(dx) + sq(dy);
    if (d2 < EPS) return;
    double d = sqrt(d2);
    if (d > rA + rB + EPS || d < fabs(rA - rB) - EPS) 
        return;
    
    double a = (sq(rA) - sq(rB) + d2) / (2 * d);
    double h = sqrt(sq(rA) - sq(a));
    double px = A.x + a * dx / d;
    double py = A.y + a * dy / d;
    
    res.push_back(Pt(px - h * dy / d, py + h * dx / d));
    res.push_back(Pt(px + h * dy / d, py - h * dx / d));
}

int main() {
    int N, M;
    double Rmx;
    cin >> N >> M >> Rmx;
    vector<double> bx(N), by(N), br(N);
    for (int i = 0; i < N; i++) {
        cin >> bx[i] >> by[i] >> br[i];
    }
    vector<Pt> enm;
    for (int i = 0; i < M; i++) {
        double x, y;
        cin >> x >> y;
        enm.push_back(Pt(x, y));
    }

    vector<Pt> cand = enm;
    
    if (N > 0) {
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                vector<Pt> tmp;
                cir_int(Pt(bx[i], by[i]), br[i] + Rmx, 
                       Pt(bx[j], by[j]), br[j] + Rmx, tmp);
                
                for (const Pt& p : tmp) {
                    bool ok = true;
                    for (int k = 0; k < N; k++) {
                        double d = dst(p, Pt(bx[k], by[k]));
                        if (d < br[k] + Rmx - EPS) {
                            ok = false;
                            break;
                        }
                    }
                    if (ok) cand.push_back(p);
                }
            }
        }

        for (int j = 0; j < M; j++) {
            for (int i = 0; i < N; i++) {
                double dx = enm[j].x - bx[i];
                double dy = enm[j].y - by[i];
                double d2 = sq(dx) + sq(dy);
                double Re = br[i] + Rmx;
                double Re2 = sq(Re);
                
                if (d2 < Re2 + EPS) continue;
                if (d2 < EPS) continue;
                
                double base_x = bx[i] + (sq(Re) * dx) / d2;
                double base_y = by[i] + (sq(Re) * dy) / d2;
                
                double sqrt_val = Re * sqrt(d2 - Re2) / d2;
                
                cand.push_back(Pt(
                    base_x - sqrt_val * dy,
                    base_y + sqrt_val * dx
                ));
                
                cand.push_back(Pt(
                    base_x + sqrt_val * dy,
                    base_y - sqrt_val * dx
                ));
            }
        }
    }

    int ans = 0;
    for (const Pt& c : cand) {
        double rad = Rmx;
        bool skip = false;
        
        for (int i = 0; i < N; i++) {
            double d = dst(c, Pt(bx[i], by[i]));
            double r_needed = d - br[i];
            
            if (r_needed < -EPS) {
                skip = true;
                break;
            }
            if (r_needed < rad) 
                rad = r_needed;
        }
        
        if (skip || rad < EPS) continue;
        
        int cnt = 0;
        for (const Pt& e : enm) {
            if (dst(c, e) < rad + EPS) 
                cnt++;
        }
        
        if (cnt > ans) ans = cnt;
    }
    
    cout << ans << endl;
    return 0;
}
2025/6/24 19:46
加载中...