2 条题解

  • 0
    @ 2025-10-8 16:58:57
    #include<bits/stdc++.h>
    using namespace std;
    const int N=60;
    int n,a[N],b[N],fa[N],s[N];
    int findfa(int x){ return (fa[x]==x)?fa[x]: fa[x]=findfa(fa[x]);}
    bool check(int x)
    {
        for(int i=1;i<=n;i++)fa[i]=i,s[i]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if((abs(a[i]-a[j])+abs(b[i]-b[j])+1)/2<=x)
                {
                    int x=findfa(i),y=findfa(j);
                    if(x!=y)
                    {
                        fa[x]=y;
                        s[y]+=s[x];
                        if(s[y]==n)return 1;
                    }
                }
            }
        return 0;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
        int l=1,r=2e9,ans;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(check(mid))ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:58:48
      #include<bits/stdc++.h>
      using namespace std;
      const int N=60;
      int n,a[N],b[N],fa[N],s[N];
      int findfa(int x){ return (fa[x]==x)?fa[x]: fa[x]=findfa(fa[x]);}
      bool check(int x)
      {
          for(int i=1;i<=n;i++)fa[i]=i,s[i]=1;
          for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
              {
                  if((abs(a[i]-a[j])+abs(b[i]-b[j])+1)/2<=x)
                  {
                      int x=findfa(i),y=findfa(j);
                      if(x!=y)
                      {
                          fa[x]=y;
                          s[y]+=s[x];
                          if(s[y]==n)return 1;
                      }
                  }
              }
          return 0;
      }
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
          int l=1,r=2e9,ans;
          while(l<=r)
          {
              int mid=(l+r)/2;
              if(check(mid))ans=mid,r=mid-1;
              else l=mid+1;
          }
          printf("%d",ans);
          return 0;
      }
      • 1

      信息

      ID
      1860
      时间
      1000ms
      内存
      512MiB
      难度
      10
      标签
      递交数
      5
      已通过
      5
      上传者