NC216199. 数菌落
描述
小Z是个讨厌生物学的初中生,对于生物课的作业他是能拖就拖,能省就省。但有一天老师要教同学们如何利用显微镜观察细胞、细菌等,并且布置了一项随堂作业:对于手中的细菌标本,通过观察确定在上面有多少个菌落。
由于小Z不喜欢生物课,并没有认真听老师的教学,只知道观察单个细菌需要的目镜和物镜的倍数搭配,而不知道直接观察菌落的搭配,所以在小Z的视野中只有n个独立的细菌细胞,为了能交上作业,他决定当两个细胞在视野中的距离不超过d则认为这两个细胞在同一个菌落,这样就能得到了一个看似菌落数的答案。
但这样的过程让小Z觉得十分麻烦,他选择把这n个细菌在视野中的坐标和设定的距离d告诉你,让你帮他算出有多少个菌落。
注:显微镜视野看做一个矩形的平面,细菌细胞坐标均为整数值,且保证不出现两个细胞在同一个点上。并且如果细胞a和细胞b在同一菌落,b和c在同一菌落,即使a和c的距离大于d,由于b的存在会连接a和c,所以a和c也视为在同一菌落,即a,b,c都在同一菌落。
输入描述
首先第一行为两个整数:n(1≤n≤1000),d(0≤d≤100);
接下来n行,每行两个整数:x,y(-10000≤x,y≤10000),表示在点(x,y)有一个细胞。
输出描述
输出一个整数,表示通过小Z的方法计算出的菌落数。
示例1
输入:
4 0 1 1 2 2 3 4 5 6
输出:
4
说明:
示例2
输入:
4 2 1 1 2 2 3 4 5 6
输出:
3
示例3
输入:
5 100 1 1 2 2 3 4 5 6 100 100
输出:
2
pypy3 解法, 执行用时: 91ms, 内存消耗: 22920K, 提交时间: 2023-04-29 16:05:24
def dist(x1,y1,x2,y2): return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) n,d=map(int,input().split()) d=d*d fa=[i for i in range(1010)] cnt=0 def find(x): if x==fa[x]: return x else: fa[x]=find(fa[x]) return fa[x] def merge(x,y): global cnt fx=find(x) fy=find(y) if fx!=fy : cnt+=1 fa[fx]=fy a=[] for i in range(n): x,y=map(int,input().split()) a.append((x,y)) for i in range(n): for j in range(i+1,n): if dist(a[i][0],a[i][1],a[j][0],a[j][1])<=d: merge(i,j) print(n-cnt)
C(clang11) 解法, 执行用时: 3ms, 内存消耗: 372K, 提交时间: 2021-01-01 15:31:20
#include <stdio.h> #include <stdlib.h> #include<string.h> int main(){int n,d,i,j,a,b; int s[1003][2],q[1003]; int v=1; scanf("%d%d",&n,&d); for(i=0;i<n;i++) scanf("%d%d",&s[i][0],&s[i][1]); if(d){ for(i=0;i<n;i++) {q[i]=v; for(j=0;j<n;j++) { if(i!=j&&(s[i][0]-s[j][0])*(s[i][0]-s[j][0])+(s[i][1]-s[j][1])*(s[i][1]-s[j][1])<=d*d){if(q[j]&&q[j]<q[i]){q[i]=q[j];v-=1; }else q[j]=q[i];} }v++;} printf("%d",v-1); } else printf("%d",n); }
C++ 解法, 执行用时: 4ms, 内存消耗: 412K, 提交时间: 2021-12-23 23:05:41
#include<bits/stdc++.h> using namespace std; int n,d,ans; int fa[1005],x[1005],y[1005]; int f(int s){ if(fa[s]!=s) return f(fa[s]); return s; } int main(){ cin>>n>>d; for(int i=1;i<=n;i++){ fa[i]=i; } for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]; for(int j=1;j<i;j++){ if((y[j]-y[i])*(y[j]-y[i])+(x[j]-x[i])*(x[j]-x[i])<=d*d) fa[f(i)]=f(j); } } for(int i=1;i<=n;i++){ if(fa[i]==i){ ans++; } } cout<<ans; return 0; }