zoukankan      html  css  js  c++  java
  • 洛谷P2504 [HAOI2006]聪明的猴子

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=5050;
     4 const int maxm=5000005;
     5 int n,m,k,ans;
     6 double Max;
     7 int monkey[maxn];
     8 typedef pair<int,int> P;
     9 P point[maxn];
    10 #define Dis(x,y) (sqrt((x.first-y.first)*(x.first-y.first)+(x.second-y.second)*(x.second-y.second)))
    11 struct node{
    12     int cnt,fa;
    13 }f[maxn];
    14 int find(int x){return f[x].fa==x?x:f[x].fa=find(f[x].fa);}
    15 void Union(int x,int y)
    16 {
    17     x=find(x),y=find(y);if(x==y) return;
    18     if(f[x].cnt<=f[y].cnt) {f[x].fa=y;f[y].cnt+=f[x].cnt;}
    19     else {f[y].fa=x;f[x].cnt+=f[y].cnt;} 
    20 }
    21 struct edge{
    22     int x,y;double dis;
    23 }E[maxm];
    24 inline bool cmp(const edge &a,const edge &b) {return a.dis<b.dis;}
    25 int main()
    26 {
    27     scanf("%d",&k);
    28     for(int i=1;i<=k;i++) scanf("%d",&monkey[i]);
    29     sort(monkey+1,monkey+1+k);
    30     scanf("%d",&n);
    31     for(int i=1;i<=n;i++) scanf("%d%d",&point[i].first,&point[i].second);
    32     for(int i=1;i<=n;i++)
    33         for(int j=1;j<=i;j++)
    34         {
    35             if(i==j) continue;
    36             E[++m].x=i;E[m].y=j;E[m].dis=Dis(point[i],point[j]);
    37         }
    38     for(int i=1;i<=n;i++) f[i].fa=i,f[i].cnt=1;
    39     sort(E+1,E+1+m,cmp);
    40     for(int i=1;i<=m;i++)
    41     {
    42         if(f[find(1)].cnt==n) break;
    43         if(find(E[i].x)!=find(E[i].y)) Union(E[i].x,E[i].y),Max=max(Max,E[i].dis);
    44     }
    45     for(int i=1;i<=k;i++) if(monkey[i]>=Max) ++ans;
    46     printf("%d",ans);
    47     return 0;
    48 }
  • 相关阅读:
    返回一个整型数组中最大子数组的和
    matlab的优缺点
    Android 软件自动更新功能的实现
    Android的依赖注入框架:Dagger
    Wireshark解密HTTPS数据流
    QQ恶搞
    QQ恶搞
    编程语言的分类
    Windows常用快捷键与常用命令
    Chrome去掉标签页8个框
  • 原文地址:https://www.cnblogs.com/yu-xing/p/10262014.html
Copyright © 2011-2022 走看看