bzoj1239
题解:
首先计算出两两之间的距离
然后二分答案
然后贪心判断是否可以放置少于等于k个
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
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=;i<n;i++)c[i]=h[i];
for (int i=;i<n;i++)
if (!c[i])
{
t=1e9;
for (int j=;j<n;j++)
if (c[j]==)t=min(t,dt[i][j]);
if (t<=x)c[i]=,tot++;
}
if (tot==n)return ;
while (temp--)
{
memset(p,,sizeof(p));
for (int i=;i<n;i++)
if (!c[i])
for (int j=;j<n;j++)
if (c[j]!=&&dt[i][j]<=x)p[j]++;
u=;
for (int i=;i<n;i++)
if (c[i]!=&&p[i]>=u)u=p[i],v=i;
if (!c[v])tot++;c[v]=;
for (int i=;i<n;i++)
if (!c[i])
{
t=1e9;
for (int j=;j<n;j++)
if (c[j]==)t=min(t,dt[i][j]);
if (t<=x)c[i]=,tot++;
}
if (tot==n)return ;
}
return ;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<n;i++)
for (int j=;j<n;j++)dt[i][j]=(i==j)?:1e9;
for (int i=;i<n;i++)scanf("%d",&r[i]);
for (int i=;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=;i<=m;i++)
{
scanf("%d",&x);
h[x]=;
}
for (int l=;l<n;l++)
for (int i=;i<n;i++)
for (int j=;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)>>;
if (judge(mid))R=mid-;
else L=mid+;
}
printf("%d\n",L);
}
bzoj1239的更多相关文章
随机推荐
- 原生ajax的请求封装get和post
一个完整的AJAX请求包括五个步骤: 1.创建XMLHTTPRequest对象 2.使用open方法创建http请求,并设置请求地址 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.获取响应 ...
- kbengine学习2 创建项目
官方文档https://www.comblockengine.com/docs/1.0/get-started/createproject/ 1.kbe服务器端 1.1 复制出一个assets文件夹, ...
- 安卓自动化测试——rf
${a} Get Text //android.widget.TextView[contains(@text,"历史位置")]/../../../android.widget.Li ...
- 20165327 学习基础和C语言基础调查
学习基础和C语言基础调查 一.关于技能 1. 你有什么技能比大多人(超过90%以上)更好? 根据数据来看,应该是短跑(几次测速50米平均时间6.5s),上学期的体测中短跑这项成绩在班上排前面,我们这个 ...
- (转)解决windows10下无法安装.net framework 3.5,错误代码0x800F081F
1.下载 NET Framework 3.5的安装包netfx3.cab 将下载的文件复制到复制到 C 盘的 Windows 文件夹 后请在“命令提示符(管理员)”中执行下面的命令: dism /on ...
- xsd与xml和类(class)对象之间的互相转换
xsd与xml和类(class)对象之间的互相转换 . 第一:通过现有的已经写好的xsd来生成class(.cs)文件. 在您Visual Studio的安装目录下的SDKv2.0Bin中有个应用程序 ...
- 动手动脑java异常处理
1>请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutEx ...
- pytorch 中的 split
Pytorch中的split问题: 1.使用torch.nn.Conv2d中有个参数是groups会将输入的feature map分组,此处需要注意的一点是分组之后各组的feature map的cha ...
- 维护满足max(+ or -)min<=k的区间
这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...
- project euler113
project euler 113 对于1个数字,如果他数位不减或者不增称为bouncy number,比如1233,33210.统计1-10^100中的bouncy number 思路:分为两种 ...