2021牛客多校赛第二场

传送门

A
B
C水题
D水题
E
F计算几何求两球的体积并
G动态规划
H
I模拟bfs
J
K模拟贪心
L


F
题意:三维坐标系,给4个点A、B、C、D的坐标以及K1和K2两个数,满足|AX|>=K1*|BX|的点X形成集合,满足|CY|>=K2*|DY|的点Y形成集合。求X集合与Y集合并集的体积

解析:首先当然需要知道X集合与Y集合大致长什么样子,推导式子很容易得知其实两个集合都是球,且可以得知球的球心与半径。那么之后就是求两个球的体积交了,套板子即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double pi=acos(-1.0);
 
double x[5],y[5],z[5];
 
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        for(int i=1;i>=0;i--)
        {
            cin >> x[i] >> y[i] >> z[i];
        }
        for(int i=3;i>=2;i--)
        {
            cin >> x[i] >> y[i] >> z[i];
        }
        double k1, k2;
        cin >> k1 >> k2;
        double ab=sqrt((x[0]-x[1])*(x[0]-x[1])+(y[0]-y[1])*(y[0]-y[1])+(z[0]-z[1])*(z[0]-z[1]));
        double l1=ab*1.0/(k1+1.0), l2=ab*1.0/(k1-1.0);
        double r1=(l2+l1)/2.0;
        double xab=(x[0]-x[1])*1.0/ab, yab=(y[0]-y[1])*1.0/ab, zab=(z[0]-z[1])*1.0/ab;
        double cax=x[0]+xab*(r1-l1), cay=y[0]+yab*(r1-l1), caz=z[0]+zab*(r1-l1);
        double cd=sqrt((x[2]-x[3])*(x[2]-x[3])+(y[2]-y[3])*(y[2]-y[3])+(z[2]-z[3])*(z[2]-z[3]));
        l1=cd*1.0/(k2+1.0);
        l2=cd*1.0/(k2-1.0);
        double r2=(l2+l1)/2.0;
        double xcd=(x[2]-x[3])*1.0/cd, ycd=(y[2]-y[3])*1.0/cd, zcd=(z[2]-z[3])*1.0/cd;
        double cbx=x[2]+xcd*(r2-l1), cby=y[2]+ycd*(r2-l1), cbz=z[2]+zcd*(r2-l1);

        double ans=0;
        double xa,ya,za,ra,va;
        double xb,yb,zb,rb,vb;
        xa=cax; ya=cay; za=caz; ra=r1;
        xb=cbx; yb=cby; zb=cbz; rb=r2;
 
        //printf("%f %f %f %f\n",xa,ya,za,ra);
        //printf("%f %f %f %f\n",xb,yb,zb,rb);
 
 
        double d=sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb)+(za-zb)*(za-zb));
        va=(4.0/3.0)*pi*(ra*ra*ra);
        vb=(4.0/3.0)*pi*(rb*rb*rb);
 
        if(d>=ra+rb)
        {
            ans=0;
        }
        else if(d+min(ra,rb)<=max(ra,rb))
        {
            ans=min(va,vb);
        }
        else
        {
            double ka,kb,vva,vvb;
            ka=ra-(((ra*ra)-(rb*rb)+(d*d))/(2*d));
            kb=rb-(((rb*rb)-(ra*ra)+(d*d))/(2*d));
            vva=(pi*ka*ka*(3*ra-ka))/3.0;
            vvb=(pi*kb*kb*(3*rb-kb))/3.0;
            ans=vva+vvb;
        }
        printf("%.10f\n",ans);
    }
    return 0;
}



G
题意:给定n个区间,需要将区间分为k组,每一个组内所有区间取交集,将每个组得到的长度取和,让这个和最大,输出这个值

解析:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值