[Luogu] 奶酪

https://www.luogu.org/problemnew/show/P3958

连边bfs / 并查集

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 1010;

#define gc getchar()

struct Node{
    double x, y, z;
}E[N];

int n;
double h, r;
int T;
int f[N];

inline int read(){
    int x = 0; char  c = gc;
    while(c < ‘0‘ || c > ‘9‘) c = gc;
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = gc;
    return x;
}

int getf(int x){
    return f[x] == x ? x : f[x] = getf(f[x]);
}

inline bool calc_dis(int x, int y){
    double X1 = E[x].x, Y1 = E[x].y, Z1 = E[x].z;
    double X2 = E[y].x, Y2 = E[y].y, Z2 = E[y].z;
    double dis = sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * ((Y1 - Y2)) + (Z1 - Z2) * (Z1 - Z2));
    return dis <= r * 2 ? 1 : 0;
}

inline bool dis_0(int x){
    if(abs(E[x].z - 0) <= r) return 1;
    return 0;
}

inline bool dis_h(int x){
    if(abs(E[x].z - h) <= r) return 1;
    return 0;
}

int main()
{
    T = read();
    while(T --){
        n = read();
        scanf("%lf%lf", &h, &r);
        for(int i = 1; i <= n; i ++) f[i] = i;
        for(int i = 1; i <= n; i ++) scanf("%lf%lf%lf", &E[i].x, &E[i].y, &E[i].z);
        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= n; j ++){
                if(i != j && calc_dis(i, j)){
                    f[getf(i)] = f[getf(j)];
                }
            }
        }
        bool flag = 1;
        for(int i = 1; i <= n && flag; i ++){
            for(int j = 1; j <= n && flag; j ++){
                if(dis_0(i) && dis_h(j) && getf(i) == getf(j)){
                    puts("Yes");
                    flag = 0;
                }
            }
        }
        if(flag) puts("No");
    }
    return 0;
}
/*
1
2 5 1
0 0 1
0 0 4
*/

原文地址:https://www.cnblogs.com/shandongs1/p/8984482.html

时间: 2024-10-31 00:20:47

[Luogu] 奶酪的相关文章

[Luogu 3958] NOIP2017 D2T1 奶酪

NOIP2017 D2T1 奶酪(Luogu 3958) 人生第一篇题解,多多关照吧. 一个比较容易想到的搜索.我用的BFS. 因为涉及到开根,所以记得开double. 首先将所有的球按z值从小到大排序,如果最下方的球与底面相离,或是最上方的球与顶面相离,直接Pass. 接下来预处理,记得先初始化,对于每一组球(i,j),计算两球球心距离是否小于半径×2,用一个bool数组e[i][j]记录i能否到达j,避免BFS时重复计算. 我们会发现,可能不止一个球与底面相切或相交,也可能不止一个球与顶面相

luogu P1433 吃奶酪

原题链接:https://www.luogu.org/problem/show?pid=1433 虽然是一道思维难度不大的DFS,但是这其中比较重要的是可行性剪枝(这是本蒟蒻做的第一道剪枝) 本题的优化点有不少:预处理两点之间的距离,用邻接矩阵存储,搜索时直接调用即可. 当目前走到的距离已经超过现有的最小值,那么就无需继续搜索下去,直接返回即可. (那些register 之类的,都是因为写了个死循环TLE了以为常数问题加的...) #include<cstdio> #include<cm

解题报告:luogu P1433 吃奶酪

题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站在了\(j\)点. 那什么是状态呢? 我们用一个零一串表示每一点有无被走过(\(0\)是没走过,\(1\)是已走过),那么转移方程就是: \[dp[i][j]=min(dp[i][j],dp[i\&((1<<n)-1-(1<<(j-1)))][k]+dis[j][k])\] 好

Luogu P3958 奶酪

#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; double h,r; struct Cheese{ double x,y,z; //重载运算符 bool operator<(const Cheese &am

洛古——P1433 吃奶酪

https://www.luogu.org/problem/show?pid=1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 输入输出样例 输入样例#1: 4 1 1 1 -1

洛谷P3958 奶酪

题目:https://www.luogu.org/problemnew/show/3958 题目描述 现有一块大奶酪,它的高度为 hh,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0,奶酪的上表面为z=h. 现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐 标.如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别 地,如果一个空洞与下表面

Luogu P2570 [ZJOI2010]贪吃的老鼠

Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的大小为\(pi\),会在第\(ri\)秒被生产出来,并且必须在第\(di\)秒之前将它吃掉.第j只老鼠吃奶酪的速度为\(sj\),因此如果它单独吃完第i快奶酪所需的时间为\(pi/sj\).老鼠们吃奶酪的习惯很独特,具体来说: (1) 在任一时刻,一只老鼠最多可以吃一块奶酪: (2) 在任一时刻,一

2019/9/27 题解:【P3958】 奶酪

题解:[P3958]  奶酪 题目: 传送门:https://www.luogu.org/problem/P3958 AC代码:DFS 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int n,outfg,cnt,anst; 8 double h

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo