E - Water Distribution


题目大意:

有\(N\)座城市,给定这\(N\)座城市的坐标和初始的水量\(x_i,y_i,a_i\),在两个城市之间运水的花费是两个城市的欧几里得距离。最小水量的城市水量最大是多少。

\(N\le 15\)

题目分析:

看数据够小,要么爆搜要么状压。

可以发现这和经典的TSP问题有些类似。

考虑通过构建联通分量来调节水,那么我们设联通分量的城市数量为\(K\),联通分量中的总水量为\(A\),联通分量中总的边长是\(B\),那么不难发现我们能够达到的最大的最小水量就是\(\frac{A-B}{k}\),因为我们需要花费B的水量而总水量是\(A\)。

我们同样可以证明出一定能够到达\(\frac{A-B}{k}\),假设我们在点\(X\)和点\(Y\)之间建立了联系,那么如果\(X\)的水的量过大,就可以都运到\(Y\)否则我们就运送到\(X\)。

我们可以通过对每种城市分布都求MST的方法来得出以上我们所需要的。这样的时间复杂度为\(O(2^n*n^2)\),然后使用枚举子集的方式即可以在\(O(3^n)\)的时间复杂度内通过此题。

#include<bits/stdc++.h>
using namespace std;
const int N=17;
double dis[N][N],f[1<<N],x[N],y[N],a[N];
int n,m;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>a[i];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
for(int i=0;i<=1<<n;i++) f[i]=1e18;
f[0]=0;
for(int i=0;i<n;i++) f[1<<i]=0;
for(int s=0;s<1<<n;s++){
for(int i=0;i<=n-1;i++)
for(int j=0;j<=n-1;j++)
if((s&(1<<i))&&(!(s&(1<<j)))) f[s|(1<<j)]=min(f[s|(1<<j)],f[s]+dis[i+1][j+1]);
}
for(int s=0;s<1<<n;s++){
f[s]=-f[s];
for(int i=0;i<n;i++)if(s&(1<<i)) f[s]+=a[i+1];
f[s]/=__builtin_popcount(s);
for(int t=(s-1)&s;t;t=(t-1)&s)
f[s]=max(f[s],min(f[t],f[s-t]));
}
printf("%.10lf\n", f[(1<<n)-1]);
}

E - Water Distribution的更多相关文章

  1. Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution

    Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution 题目链接:https://atcoder.jp/contests/cf16- ...

  2. 海量数据挖掘MMDS week1: Link Analysis - PageRank

    http://blog.csdn.net/pipisorry/article/details/48579435 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  3. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  4. CET4

    Directions: For this part, you are allowed 30 minutes to write a short essay on the challenges of st ...

  5. leetcode hard

    # Title Solution Acceptance Difficulty Frequency     4 Median of Two Sorted Arrays       27.2% Hard ...

  6. leetcode difficulty and frequency distribution chart

    Here is a difficulty and frequency distribution chart for each problem (which I got from the Interne ...

  7. [LeetCode] Pacific Atlantic Water Flow 太平洋大西洋水流

    Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...

  8. [LeetCode] Trapping Rain Water II 收集雨水之二

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...

  9. [LeetCode] Water and Jug Problem 水罐问题

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...

随机推荐

  1. ios在数字键盘左下角添加“完成”按钮的实现原理

    本文转载至 http://www.itnose.net/detail/6145865.html 最近要在系统弹出的数字键盘上的左下角额外添加一个自定制的完成按钮,于是研究了一下系统自带键盘添加自定制按 ...

  2. 关于sqlSessionTemplate

    SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTempla ...

  3. 关于小程序报错 缺少文件,错误信息:error: iconPath=../images/home.png, file not found

    事实上在小程序中,虽然你的image文件夹是和你index文件夹的父级文件夹并行的文件夹,但是你如果引用的时候,不用去遵循    ../   或者   ./因为在小程序当中他根本不识别.所以要引用的话 ...

  4. Linux网络配置:设置IP地址、网关DNS、主机名

    查看网络信息 1.ifconfig eth0 2.ifconfig -a 3.ip add 设置主机名需改配置文件: /etc/hosts /etc/sysconfig/network vim /et ...

  5. python的进程与线程

    一.进程与线程的相关概念 1.什么是进程 进程是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序,数据集,进程控制块三部分组成. 2.什么是线程 线程也叫轻量级进程,它是一个基本的CPU执行 ...

  6. Python(数据库之表操作)

    一.修改表 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; #mysql中库名.表名对大小写不敏感 2. 增加字段 ALTER TABLE 表名ADD 字段名 数据类型 [完整性 ...

  7. Android Studio "佛祖保佑 永无bug" 注释模板设置详解(仅供娱乐)

    1.注释模板效果图 今天在网上看到一段有趣的注释,佛祖保佑 永无bug, 效果如下图所示: 代码如下所示: /** * _ooOoo_ * o8888888o * 88" . "8 ...

  8. 安卓使用Canvas绘制工作日程表

    有一个项目要使用工作表,选择使用canvas来绘制.实现显示工作日程的选择,可点击加入和取消,效果图:http://jwzhangjie.com/workplan.gif 自己定义控件FormView ...

  9. Kotlin 初级读本

    第一部分——快速上手第一章·启程 第二章·基本语法第三章·Kotlin 与 Java 混编 第二部分——开始学习 Kotlin第四章·Kotlin 的类特性(上)第四章·Kotlin 的类特性(下)第 ...

  10. tarball源码安装

    软件最原始的安装方法 用tarball来安装升级make命令执行make ,会在当前路径下搜索makefile这个文本文件,这个文件中记录了源码如何编译的详细信息.软件开发商通常会写一个检测程序,检测 ...