牛客 ( 计算几何

#include 
using namespace std;
using ll = long long;
using PII = pair;
int n;
PII p[3000010];
vector pp;
PII yuan(PII a , PII b , PII c)
{
    //已知三个点确定圆的半径和圆心
    double x1 = a.first,x2 = b.first,x3 = c.first,y1 = a.second,y2 = b.second,y3 = c.second,x,y,r,A,B,C,D;
    A=x1*(y2-y3)-y1*(x2-x3)+x2*y3-x3*y2;
    B=(x1*x1+y1*y1)*(y3-y2)+(x2*x2+y2*y2)*(y1-y3)+(x3*x3+y3*y3)*(y2-y1);
    C=(x1*x1+y1*y1)*(x2-x3)+(x2*x2+y2*y2)*(x3-x1)+(x3*x3+y3*y3)*(x1-x2);
    D=(x1*x1+y1*y1)*(x3*y2-x2*y3)+(x2*x2+y2*y2)*(x1*y3-x3*y1)+(x3*x3+y3*y3)*(x2*y1-x1*y2);
    x=-B/(2*A);
    y=-C/(2*A);
    //r=sqrt((B*B+C*C-4*A*D)/(4*A*A));
    //-1表示圆不存在
    if(!A){
        return {-1e9 , -1e9};
    }else{
        return {x,y};
    }

}
int main(){
    cin>>n;
    for(int i = 1; i <= n ; i++){
        cin>>p[i].first>>p[i].second;
    }
    for(int i = 1; i <= n ; i++){
        for(int j = i + 1; j <= n; j++){
            auto x = yuan({0,0} , p[i] , p[j]);
            if(x.first == -1e9 && x.second == -1e9) continue;
            else pp.push_back(x);
        }
    }
    
    if(pp.size() == 0){
        cout<<1;
        return 0;
    }
    sort(pp.begin() , pp.end());
    auto now = pp[0];
    int num = 1;
    int ct = 1;//记录每个圆心出现多少次
    for(int i = 1; i < pp.size() ; i++){
        if(pp[i] == now) {
            num++;
            ct = max(ct, num);
        }else{
            now = pp[i];
            ct = max(ct , num);
            num = 1;
        }
    }
    for(int i = 1 ; i <= n ; i++){
        if(i * (i-1) >> 1 == ct){
            cout<

B-Boundary_2023牛客国庆集训派对day2 (nowcoder.com)

圆心的计算公式是抄的 , 然后这题想到枚举圆心很简单,三点定圆

然后就是考虑哪个圆心出现的次数最多,

考虑这个圆心经过了n 个点  那么这个圆心就会出现\binom{2}{n}次 ,\binom{2}{n}  =  ct

你可能感兴趣的:(基本算法,算法,c++,数据结构)