P3928奶酪

传送

今天早晨,神志不清的我决定拿头过这道题

终于在wa了6次之后过了

emm  明明都是一些细节自己却注意不到啊啊啊不能再颓了!!!!!!!!!!!!

好了回归正题

首先我们要开long long

其次我们来说一说思路

大佬xcg讲了两种做法

一.搜索

不好想不好写,比第二种算法快

洛谷标签说是广搜,但这个题深搜会比广搜快,因为这里是判断有没有解,而不是让你求最短路

如果要求最短路怎么办?拿头过三维迪杰斯特拉我也不知道

所以我们不讨论怎么求最短路(没有杠精)

我们怎么搜呢?

当然是从下表面开始了(当然也可以从上表面开始,看能否通到下表面,更可以看上下表面哪个洞少就从那个开始搜)

在搜索过程中,就不断找到与当前点相通的点。同时又因为只是判断有没有解,所以只要找到解,就可以直接返回,然后让上一层的程序也返回。这可以用一个标记做到。

问题来了,怎么判断两个洞是否相通?

我们计算两个洞的球心的距离,如果它<=2*r,则证明这两个洞相交或者相切(我也不知道jerry是怎么在相切的时候穿过这一个接触的点的),当等于时,是相切。否则,就不相通。

与底部相通:判断洞的球心的高度-r是否<=0(不是<=h)(我也不知道手残打出来的为什么还有30分)

与顶部相通:球心高度+r>=h

拿头硬过的代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read()
{
    char ch=getchar();
    ll x=0;bool f=0;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return f?-x:x;
}
ll t,n,h,r;
bool bj,vis[1009];
struct qiu{
    ll x,y,z;
}p[1009];
bool cmp(qiu a,qiu b)//一个优化退化:按照所有球心的高度进行排序,如果从某个球开始就不与底部相通,则后面的球都不会与底部相通(据lz实测会慢emmmm)
{
    return a.z<b.z;
}
double jl(qiu a,qiu b)
{
    return sqrt((double)((a.x-b.x)*(a.x-b.x))+(double)((a.y-b.y)*(a.y-b.y))+(double)(a.z-b.z)*(a.z-b.z));
}
void dfs(ll k)
{
    if(p[k].z+r>=h)
    {
        bj=1;//bj标记有解
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(bj)return;//若有解则不继续搜索
        if(jl(p[k],p[i])<=2.0*r&&!vis[i])
        {
            vis[i]=1;
            dfs(i);
        }
    }
}
int main()
{

    t=read();
    for(ll i=1;i<=t;i++)
    {
        memset(vis,0,sizeof(vis));
        bj=0;
        n=read();h=read();r=read();
        for(ll j=1;j<=n;j++)
         p[j].x=read(),p[j].y=read(),p[j].z=read();
        sort(p+1,p+1+n,cmp);
        for(int j=1;j<=n;j++)
        {
            if(bj)break;
            if(p[j].z-r<=0)//可别手残了
            {
                vis[j]=1;
                dfs(j);
            }
            else break;
        }    
        if(!bj)printf("No\n");
        else printf("Yes\n");
    }
}

 

相关推荐:

ZH奶酪:Python中zip函数的使用方法

定义:zip([iterable,…]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些 tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作...

【NOIP2017】奶酪

本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P3958   应该算NOIP2017里比较简单的。。。 一开始以为水上了天,直接用邻接矩阵存边,结果TLE了两个点,改成邻接链表就过了。应该是多组输入数据的原因。 这道题需要注意的是溢出错误,虽然坐标不...

奶酪真香

队名 我们又动了谁的奶酪 团队成员的姓名与学号 211606387叶宏奇(队长) 211606354 陈泓宇 211606306 黄柏涛 211606308 江东 211606309 焦成伟 211606375 牛振乾 211606310 柯伟敏 211606385 谢章洪 队长的博客链接 队长博客...

[JSOI2007]奶酪

奶酪和pizza一样,是一小块扇形的固体。在奶酪从工厂里生产出来的时候,一共有4种形状,编号为1~4,分别是圆心角为72º;;,144º;;,216º;;,288º;;的扇形。奶酪的盒子是圆形的,半径和奶酪的半径一致。也就是说,一块1号奶酪和一块4号奶酪可以恰好装入一个盒子,一块2号奶酪和一块3号奶...

NOIP 2017 奶酪

洛谷传送门 JDOJ3157:[NOIP2017]奶酪D2T1 JDOJ传送门 Description   现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z=0,奶酪的上表面为z=h...

NOIP 2016 奶酪

这么水的题才拿了80分???????????????? QAQAWSL sqrt精度问题要注意,***不开方而去比较平方避免精度问题 #include<iostream> #include<cstdio> #include<algorithm> #include&...

luogu 3958 奶酪

noip2017D2T1奶酪某zz选手没有想到可以用并查集来做,直接用了dijskstra,结果被ccf老爷机卡成了70分 题目大意: 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞 我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面...

NOIP 2017 奶酪

题目链接 https://www.luogu.org/problemnew/show/P3958 去年貌似只拿了30分 现在24分钟AC掉了 还是有进步的 注意在考场上自己出一些特殊的数据来测 比如这道题在一个球同时切上下的时候我的程序就有bug WA了一次 #include<bits/std...