zoukankan      html  css  js  c++  java
  • bzoj1239

    题解:

    首先计算出两两之间的距离

    然后二分答案

    然后贪心判断是否可以放置少于等于k个

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=50;
    int n,m,k,x,i,j,l,L,R,mid,r[N],d[N],h[N],dt[N][N];
    int judge(int x)
    {
        int temp=k,tot=m,t,u,v,c[N],p[N];
        for (int i=0;i<n;i++)c[i]=h[i];
        for (int i=0;i<n;i++)
         if (!c[i])
          {
            t=1e9;
            for (int j=0;j<n;j++)
            if (c[j]==1)t=min(t,dt[i][j]);
            if (t<=x)c[i]=2,tot++;
          }
        if (tot==n)return 1;
        while (temp--)
         {
            memset(p,0,sizeof(p));
            for (int i=0;i<n;i++)
             if (!c[i])
              for (int j=0;j<n;j++)
               if (c[j]!=1&&dt[i][j]<=x)p[j]++;
            u=0;
            for (int i=0;i<n;i++)
             if (c[i]!=1&&p[i]>=u)u=p[i],v=i;
            if (!c[v])tot++;c[v]=1;
            for (int i=0;i<n;i++)
             if (!c[i])
              {
                t=1e9;
                for (int j=0;j<n;j++)
                 if (c[j]==1)t=min(t,dt[i][j]);
                if (t<=x)c[i]=2,tot++;
              }
            if (tot==n)return 1;
         }
        return 0;
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for (int i=0;i<n;i++)
         for (int j=0;j<n;j++)dt[i][j]=(i==j)?0:1e9;
        for (int i=0;i<n;i++)scanf("%d",&r[i]);
        for (int i=0;i<n;i++)
         {
            scanf("%d",&d[i]);
            R+=d[i];
            dt[i][r[i]]=dt[r[i]][i]=min(dt[i][r[i]],d[i]);
         }
        for (int i=1;i<=m;i++)
         {
            scanf("%d",&x);
            h[x]=1;
         }
        for (int l=0;l<n;l++)
         for (int i=0;i<n;i++)
          for (int j=0;j<n;j++)
           if (i!=j&&i!=l&&j!=l)
            if (dt[i][l]+dt[l][j]<dt[i][j])dt[i][j]=dt[i][l]+dt[l][j];
        while (L<=R)
         {
            mid=(L+R)>>1;
            if (judge(mid))R=mid-1;
            else L=mid+1;
         }
        printf("%d
    ",L);
    }
  • 相关阅读:
    项目目标文档
    系统利益相关者描述案例
    软件需求模式 读书笔记二
    软件需求分析 读书笔记1
    专业实训题目需求分析
    2015年秋季个人阅读计划
    CodeVs 1615 数据备份
    HDU 3900 Unblock Me
    HDU 5898 odd-even number
    HDU 5877 Weak Pair
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8482930.html
Copyright © 2011-2022 走看看