HDU 3362 Fix
题目大意:题目给出n(n <= 18)个点的二维坐标,并说明某些点是被固定了的,其余则没固定,要求添加一些边,使得还没被固定的点变成固定的,当一个没固定的点和两个固定了的点连接后,该点就被间接固定了(三角形的稳定性质),无论是直接固定还是间接固定的点,都可以供以后的点用于固定,添加的边的总长度即为代价
题解:观察数据范围,状压Dp可做,对于当前需要固定的点,在已经是固定状态的点中选出两个距离当前点最小的,这就保证了局部最优,从起始状态开始转移,最后判断能否到达最终目标状态就可以了。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n,x[20],y[20],fix[20];
double dp[1<<18];
double dis(int a,int b){
return sqrt(1.0*(x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])*1.0);
}
double F(int pos,int x){
double ans=0,d[20];
bool mark[20];
for(int i=0;i<n;i++){
if((1<<i)&pos)mark[i]=1,d[i]=dis(i,x);
else mark[i]=0;
}
for(int i=0;i<2;i++){
double min=1e9;int p=0;
for(int j=0;j<n;j++)if(mark[j]&&d[j]<min)min=d[j],p=j;
ans+=min; mark[p]=0;
}if(ans>=1e9)return -1;
return ans;
}
int main(){
while(scanf("%d",&n),n){
int begin=0,end=0;
for(int i=0;i<n;i++){
scanf("%d%d%d",&x[i],&y[i],&fix[i]);
if(fix[i])begin+=(1<<i);
end+=(1<<i);
}
for(int i=0;i<(1<<n);i++)dp[i]=1e9;dp[begin]=0;
for(int i=begin;i<end;i++){
if(dp[i]==1e9)continue;
for(int j=0;j<n;j++){
if(i&(1<<j))continue;
double sum=F(i,j);
if(sum>0)dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+sum);
}
}
if(dp[end]==1e9)puts("No Solution");
else printf("%.6lf\n",dp[end]);
}return 0;
}
HDU 3362 Fix的更多相关文章
- HDU 3362 Fix(状压dp)
Fix Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 3362 Fix (状压DP)
题意:题目给出n(n <= 18)个点的二维坐标,并说明某些点是被固定了的,其余则没固定,要求添加一些边,使得还没被固定的点变成固定的, 要求总长度最短. 析:由于这个 n 最大才是18,比较小 ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- 2014 Super Training #1 B Fix 状压DP
原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意: ...
- hdu 3288 Resource Allocation
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3288 Resource Allocation Description HDU-Sailormoon i ...
- hdu 1509 Windows Message Queue
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...
- hdu 4217 Data Structure?/treap
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...
- HDU 4116 Fruit Ninja
http://acm.hdu.edu.cn/showproblem.php?pid=4116 题意:给N个圆,求一条直线最多能经过几个圆?(相切也算) 思路:枚举中心圆,将其他圆的切线按照极角排序,并 ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
随机推荐
- opcache effect
with open opcache, the monitor cpu idle log , there are so much curl_exec and gzip in our php logic ...
- Windows Server 2008 Enterprise使用12G内存
开启PAE选项,用以下命令解决这个问题: 1.开始运行cmd2.输入 BCDEdit /set PAE forceenable 后回车3.重起系统显示12GB内存,一切正常
- windows下载安装requests
1.下载地址:https://github.com/kennethreitz/requests 2.解压缩后,cd requests 3.安装 python setup.py install
- property、synthesize、id
1.@property int age; 在编译器情况下会自动编译展开为: <age在setter中首字母大写,点语法为p.age> - (void)setAge:(int)age; - ...
- [原创]浅谈如何使用gcc开发NT核心驱动程序
原文链接:[原创]浅谈如何使用gcc开发NT核心驱动程序 一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来.诚然,用VC 配合 WINDDK 的确工作的不错,但或 ...
- iphone:自定义UIAlertView
由于项目中有这样一个需求:需要在保存是弹出框选择保存的地点.选择UIAlertView来实现,但是要在UIAlertView中增加UISwitch的控件,这就需要自定义一个继承UIAlertView的 ...
- Python 模块的一般处理
因为Python模块在被导入时,定义在模块中的顶级代码是会被执行的!如果我们想改变这种运行方向可以这样做: if __name__ == '__main__':#当这个模块作为主程序时__name__ ...
- 9.java.lang.ClassCastException
java.lang.ClassCastException 数据类型转换异常 当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码. Object o ...
- 游标-----内存中的一块区域,存放的是select 的结果
游标-----内存中的一块区域,存放的是select 的结果 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集 ...
- vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)
这几天写程序,无意间把编译中间文件给删了,然后就出现了C1083编译错误. xxx.cpp ..\commen\xxx.cpp(2) : fatal error C1083: 无法打开预编译头文件:“ ...