1 条题解
-
6
#include<cstdio> #include<algorithm> using namespace std; struct point{ int x, y; }pt[100010]; struct edge{ int u, v, dis; }ed[1000010]; int num=0,n,m,t=0,lim=0; int a[100010],book[1000010],f[1000010]; int etot=0; bool cmp(const edge &a, const edge &b){ return a.dis<b.dis; } int caldis(int i,int j){ return (pt[i].x-pt[j].x) * (pt[i].x-pt[j].x) + (pt[i].y-pt[j].y) * (pt[i].y - pt[j].y); } void add(int u,int v){ ed[++num].u=u; ed[num].v=v; ed[num].dis=caldis(u,v); } int getfather(int x){ if(x == f[x]) return x; return f[x]=getfather(f[x]); } void Kruscal(){ sort(ed+1, ed+num+1, cmp); for(int i=1; i<=n; i++) f[i] = i; for(int i=1; i<=num; i++){ int y=getfather(ed[i].u); int x=getfather(ed[i].v); if(x != y){ ++etot; f[y] = x; } if(etot==n-1) {//完成的一棵树 lim=ed[i].dis;//最大的边 break; } } } int main(){//前面函数编写完成,我们开始运用吧 scanf("%d", &m);//输入猴子个数 for(int i=1; i<=m; i++) scanf("%d", &a[i]);//输入每只猴子最大跳跃距离 scanf("%d", &n);//输入树的总数 for(int i=1; i<=n; i++) scanf("%d%d", &pt[i].x, &pt[i].y);//输入第N+3行为N棵树的坐标 for(int i=1; i<n; i++) for(int j=i+1; j<=n; j++) add(i, j); Kruscal(); for(int i=1; i<=m; i++) if(a[i] * a[i] >= lim) t++;//统计 printf("%d\n", t);//输出 return 0; }
不完全是自己写的,有些是看书写,非常的完美,已AC
- 1
信息
- ID
- 1885
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 141
- 已通过
- 53
- 上传者