列表

详情


NC216199. 数菌落

描述

Z是个讨厌生物学的初中生,对于生物课的作业他是能拖就拖,能省就省。但有一天老师要教同学们如何利用显微镜观察细胞、细菌等,并且布置了一项随堂作业:对于手中的细菌标本,通过观察确定在上面有多少个菌落。

由于小Z不喜欢生物课,并没有认真听老师的教学,只知道观察单个细菌需要的目镜和物镜的倍数搭配,而不知道直接观察菌落的搭配,所以在小Z的视野中只有n个独立的细菌细胞,为了能交上作业,他决定当两个细胞在视野中的距离不超过d则认为这两个细胞在同一个菌落,这样就能得到了一个看似菌落数的答案。

但这样的过程让小Z觉得十分麻烦,他选择把这n个细菌在视野中的坐标和设定的距离d告诉你,让你帮他算出有多少个菌落。
注:显微镜视野看做一个矩形的平面,细菌细胞坐标均为整数值,且保证不出现两个细胞在同一个点上。并且如果细胞a和细胞b在同一菌落,bc在同一菌落,即使ac的距离大于d,由于b的存在会连接ac,所以ac也视为在同一菌落,即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;
}

上一题