NOIP2017提高组DAY2T1 - 奶酪

2023-11-09 04:30
文章标签 提高 noip2017 奶酪 day2t1

本文主要是介绍NOIP2017提高组DAY2T1 - 奶酪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

在这里插入图片描述
输入
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n, h 和 r, 两个数之间以一个空格分开,分别代表奶酪中空 洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x、 y、 z, 两个数之间以一个空格分开, 表示空 洞球心坐标为(x, y, z)。

输出
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中, Jerry 能从下 表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。

样例输入
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
样例输出
Yes
No
Yes

在这里插入图片描述

【数据规模与约定】
对于 20%的数据, n = 1, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 40%的数据, 1 ≤ n ≤ 8, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 80%的数据,1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 100%的数据, 1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 1,000,000,000, T ≤ 20,坐标的 绝对值不超过 1,000,000,000

Experience

咬咬手指,扣扣脑袋,( ⊙ o ⊙ )啊!灵光一闪, n 2 n^2 n2建图bfs跑一遍,就可以判是否能到达了。算了算复杂度 n 2 ∗ T n^2*T n2T,沉思……应该能卡过去
然后稀里糊涂的写了一发,居然就A了!!!
然而正当我高高兴兴的时候,隔壁大佬cxr凑过来看了一眼,这不是并查集吗?
啥……
并……查……集……
感觉任督二脉突然被打通,一下子就发现自己傻逼了
判连通的话用并查集不就解决了吗???
还是太弱了啊……………………


Analysis

T1还是比较好做的
判两个洞是否相交(或相切)就是看它们球心的距离是否 &lt; = 2 ∗ r &lt;=2*r <=2r
如果相交的话就将这两个洞合并(并查集实现)
判断是否和下部(或顶部)相通,就是看球心的位置 + − r +-r +r是否 &lt; = 0 ∣ ∣ &gt; = h &lt;=0||&gt;=h <=0>=h
最后就判断一下0和顶部(n+1)是否在同一个集合里就可以了

Code

这个代码是贴的神仙zzh的,(毕竟我不是这样写的)


#include <bits/stdc++.h>
using namespace std;
const int Max=1010;
int t,n,h,r,flag,father[Max];
struct shu{long long x,y,z;};
shu a[Max];
inline int get_int()
{int x=0,f=1;char c;for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());if(c=='-') {f=-1;c=getchar();}for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';return x*f;
}
inline bool comp(const shu &a,const shu &b){return a.z<b.z;}
inline double calc(int i,int j){return sqrt(double(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z));}
inline int getfather(int v){return father[v]==v ? v : father[v]=getfather(father[v]);}
int main()
{t=get_int();while(t--){memset(a,0,sizeof(a));n=get_int(),h=get_int(),r=get_int();for(int i=1;i<=n;i++) a[i].x=get_int(),a[i].y=get_int(),a[i].z=get_int();sort(a+1,a+n+1,comp);for(int i=1;i<=n;i++) father[i]=i;if(a[n].z+r<h || a[1].z>r) {cout<<"No\n";continue;}for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(calc(i,j)<=2*r){int fax=getfather(i),fay=getfather(j);if(fax!=fay) father[fay]=fax;}flag=0;for(int i=n;i>=1;i--){if(flag) break;if(a[i].z+r<h || flag) break;for(int j=1;j<=n;j++){if(a[j].z>r) break;if(getfather(j)==getfather(i)&&a[j].z+r>=0) {flag=1;break;}}}cout<<(flag ? "Yes\n" : "No\n");}return 0;
}

再放一份我的BFS代码
思路清晰,代码好写
我不要脸

#include<bits/stdc++.h>
#define in read()
#define N 1009
#define M 2000009
#define ll long long
using namespace std;
inline ll read(){char ch;int f=1;ll res=0;while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-'0';ch=getchar();}return f==1?res:-res;
}
int T;
ll n,h,r;
struct node{double x,y,z;}p[N];
int nxt[M],to[M],head[N],ecnt=0;
bool vis[N];
void add(int x,int y){	nxt[++ecnt]=head[x];head[x]=ecnt;to[ecnt]=y;}
void init(){ecnt=0;memset(head,0,sizeof(head));
}
double Pow(double a) {return a*a;}
double calc(int x,int y){return sqrt(Pow(p[x].x-p[y].x)+Pow(p[x].y-p[y].y)+Pow(p[x].z-p[y].z));
}
bool bfs(){memset(vis,0,sizeof(vis));queue<int> q;q.push(0);while(!q.empty()){int u=q.front();q.pop();for(int e=head[u];e;e=nxt[e]){int v=to[e];if(v==n+1) return 1;if(!vis[v]) q.push(v),vis[v]=1;}}return 0;
}
int main(){T=in;int i,j,k;while(T--){init();n=in;h=in;r=in;for(i=1;i<=n;++i){p[i].x=in;p[i].y=in;p[i].z=in;if(p[i].z-r<=0) add(0,i),add(i,0);if(p[i].z+r>=h) add(n+1,i),add(i,n+1);}for(i=1;i<n;++i)for(j=i+1;j<=n;++j){double dis=calc(i,j);if(dis<=2*r) add(i,j),add(j,i);}if(bfs()) printf("Yes\n");else printf("No\n");}return 0;
}

这篇关于NOIP2017提高组DAY2T1 - 奶酪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373972

相关文章

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

如何提高开发的效率,让老板不知所措的给你发工资

设计模式 UML JSP 编程 数据结构 1.你可能会常常发现,写了一段代码后,编译程序时是一大堆的出错 (原因:语法不熟)  ──别担心,这是每个程序员必须经历的事,这时候你就需要更大的耐心及细心,对每一行代码进行仔细人阅读并改正,这个很重要,这可以培养你的理解代码能力,所以要常读程序,不要等到程序运行以后才知道你的程序的结果。  ──如何避免:在写代码以前,要认真的学习计算机语

Java开发实例大全提高篇——Applet的应用

开发十年,就只剩下这套架构体系了! >>>    第21章  Applet的应用 21.1  Applet在html中的使用 实例549  在html中显示Applet HtmlShowApplet.java     public void paint(Graphics g){         g.drawString("html文件已经运行", 50, 50);// 绘制文本

Java开发实例大全提高篇——Java安全

开发十年,就只剩下这套架构体系了! >>>    第6篇  Java安全与Applet应用篇 第20章  Java安全 20.1  Java对称加密 实例531  使用BASE64加密     public static String encryptBASE64(byte[] data) {         //加密数据         return (new BASE64Encoder()

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

C++提高编程三(vector容器、deque容器)

文章目录 vector容器vector赋值操作vector容量和大小vector插入和删除vector数据存取vector互换容器vector预留空间deque容器构造函数deque赋值操作deque大小操作deque 插入和删除deque 数据存取deque 排序 vector容器 vector容器数据结构和数组相似,也称为单端数组。区别在于数组是静态空间,vector可以

随着人们网络安全意识提高,软件架构设计与评估也成为重中之重

目录 案例 【题目】 【问题 1】(13 分) 【问题 2】(12分) 【答案】 【问题 1】答案 【问题 2】答案 相关推荐 案例         阅读以下关于软件架构设计与评估的叙述,回答问题 1 和问题 2。 【题目】         某电子商务公司为正更好地管理用户,提升企业销售业绩,拟开发一套用户管理系统。该系统的基本功能是根据用户的消费级别、消费历史、信

兔子-提高xampp中php的版本/提高php项目的版本

我是一个php菜鸟,我的博客也不是多么高大上,我只是记录下我自学过程中遇到的问题,有待于以后在复习,同时也希望能帮助到大家。 我用的开发环境是:xampp+phpstorm 解决办法:安装一个带有高版本php的xampp 以下是我出现这个问题到解决问题的过程。 曾经我在这里改php的版本,但是echo phpversion();版本总是不变。 后来经过问别人,别人建议我