JZOJ8月10日提高组T2 Fix

题目

Description

There are a few points on a plane, and some are fixed on the plane, some are not. We want to connect these points by some sticks so that all the points are fixed on the plane. Of course, we want to know the minimum length of the sum of the sticks.

As in the images, the black points are fixed on the plane and red ones are not, which need to be fixed by sticks.

All the points in the left image have been fixed. But the middle one is not, which we need add one stick to fix those four points (the right image shows that stick). Triangle is steady, isn’t it?

Input

The input consists of multiply test cases. The first line of each test case contains one integer, n (1 <= n <= 18), which is the number of points. The next n lines, each line consists of three integers, x, y, c (0 <= x, y < 100). (x, y) indicate the coordinate of one point; c = 1 indicates this point is fixed; c = 0 indicates this point is not fixed. You can assume that no two points have the same coordinate.

The last test case is followed by a line containing one zero, which means the end of the input.

Output

Output the minimum length with six factional digits for each test case in a single line. If you cannot fix all the points, then output “No Solution”.

Sample Input

4

0 0 1

1 0 1

0 1 0

1 1 0

3

0 0 1

1 1 0

2 2 0

0

Sample Output

4.414214

No Solution

Hint

大概意思就是给你一些点,其中一些点是固定的,然后还有一些没有固定的,然后问你固定所有点所用的线段的最小长度是多少。

所谓固定,就是形如三角形的情况,就是两个固定的点向一个未固定的点连两条边,就能把未固定的点固定。

题解

题意

给出\(n\)个点,其中一些点是固定的,然后还有一些没有固定的,问固定所有点所用的线段的最小长度是多少。

定义固定:两个固定的点向一个未固定的点连两条边,就能把未固定的点固定。

分析

可以想到状压\(DP\)来维护状态

如果枚举状态、固定点和连线点的话,将会是\(O(2^n*n^3)\)

思考优化

既然要答案优,就要使得连线点更加靠经固定点

那么排序后扫一遍就可以了

优化至\(O(2^n*n^2)\)

Code

#include<cmath>
#include<cstdio>
#include<algorithm>
#define inf 2147483646.9
using namespace std;
int n,now,fix,op,i,j,k,num,er[20];
double l,f[500005];
struct node1
{
int x,y;
}a[20];
struct node
{
double val;
int id;
}dis[20][20];
double sqr(int x)
{
return 1.0*x*x;
}
bool cmp(node x,node y)
{
return x.val<y.val;
}
int main()
{
while (true)
{
scanf("%d",&n);
if (n==0) break;
now=0;
fix=0;
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&op);
if (op==1)
{
fix++;
now+=(1<<(i-1));
}
}
if (fix==n)
{
printf("0.000000\n");
continue;
}
if (fix<2)
{
printf("No Solution\n");
continue;
}
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
dis[i][j].val=sqrt(sqr(a[i].x-a[j].x)+sqr(a[i].y-a[j].y));
dis[i][j].id=j;
}
sort(dis[i]+1,dis[i]+n+1,cmp);
}
for (i=0;i<=n;i++)
er[i]=1<<i;
for (i=1;i<=(1<<n);i++)
f[i]=inf;
f[now]=0;
for (i=now;i<(1<<n);i++)
{
if (f[i]!=inf)
for (j=1;j<=n;j++)
if ((i&(1<<(j-1)))==0)
{
num=0;
l=0;
for (k=1;k<=n;k++)
if ((i&(1<<(dis[j][k].id-1)))!=0)
{
num++;
l+=dis[j][k].val;
if(num==2)
{
f[i+(1<<(j-1))]=min(f[i+(1<<(j-1))],f[i]+l);
break;
}
}
}
}
printf("%.6f\n",f[(1<<n)-1]);
}
return 0;
}

JZOJ8月10日提高组T2 Fix的更多相关文章

  1. 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列

    [NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...

  2. JZOJ8月10日提高组反思

    JZOJ8月10日提高组反思 T1 没想到怎么打 就去打暴力了 本来想拿个30不错了 结果\(AC\)了 话说回来,数据也挺小的 T2 不AC便爆0 就一个数据点 给不给打暴力的人活了 正解是状压DP ...

  3. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  4. JZOJ8月15日提高组反思——2020年暑假终结篇

    JZOJ8月15日提高组反思--2020年暑假终结篇 T1 仙人掌最短路 抱歉我只会最短路 仙人掌是啥? 听说是缩点+\(LCA\) 最短路30 T2 直接暴力计算 正解\(DP\) \(amazin ...

  5. JZOJ2020年8月11日提高组T2 宝石

    JZOJ2020年8月11日提高组T2 宝石 题目 Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是 ...

  6. 【GDKOI2014】JZOJ2020年8月13日提高组T2 石油储备计划

    [GDKOI2014]JZOJ2020年8月13日提高组T2 石油储备计划 题目 Description Input Output 对于每组数据,输出一个整数,表示达到"平衡"状态 ...

  7. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  8. JZOJ8月5日提高组反思

    JZOJ8月5日提高组反思 再次炸了 虽然不是爆0 但也没差多少-- T1 想的DP 然后就打了 一开始是只能拿60的 后来想到了用前缀和优化 然后打完交了 最后一分钟测了一下空间 爆了 就赶紧把数组 ...

  9. JZOJ8月4日提高组反思

    JZOJ8月4日提高组反思 被一堆2018&2019&2020的巨佬暴打 又是愉快的爆0的一天呢 T1 看了看题 没想法 暴力走起 求个质因数呀,二分呀-- 然后就炸了 正解预处理加二 ...

随机推荐

  1. ajax传值出现乱码问题

    第一种:前台传值到后台,浏览器控制台打印正常,controller接收后成了乱码. 后台controller层加上两行转换代码 name=URLDecoder.decode(name,"ut ...

  2. Hill密码解密过程(Java)

    Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...

  3. 10、Django与Ajax

    AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JS ...

  4. leetcode24:word-ladder-ii

    题目描述 给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列: 每一次转换只能改变一个单词 每一个中间词都必须存在单词字典当中 例如: 给定的初始单词st ...

  5. nginx&http 第三章 ngx 请求处理的 11 个阶段 --ngx_http_process_request& ngx_http_handler

    ngx_http_process_request如果设置了定时器则删除,既然所有的请求已经接收完毕,就不会再发生超时了 重设连接的读写回调函数 重设请求读事件回调函数 调用 ngx_http_hand ...

  6. NO.A.0009——day04——idea的安装及配置教程

    概述: 集成开发环境:IDE.开发工具Integrated Development Environment,IDE, 1.如果自己手洗衣服: 1. 准备一盆水 2. 放入衣服浸泡30分钟 3. 搓洗衣 ...

  7. Python_微信开发

    <!-- 发消息功能 --> 0.微信开发的2个库 pip install werobot pip install 1.新建项目 2.项目下新建 robot 的app 3.写robot.p ...

  8. Python_网络编程_socket()

    什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 详细资 ...

  9. 创建Spring Cloud聚合项目

    使用maven创建单一项目的时候通常用不到聚合项目,创建spring cloud项目时候,由于下面都是一个一个微服务,每个服务对应一个项目,这就需要用到聚合项目,方便对依赖和项目之间的关系进行管理,使 ...

  10. Collectiont和Collections的区别

    Collectiont 和 Collections 的区别 Collection: 是Java提供的集合接口 存储一组不唯一,无序的对象 有两个子接口 List 和 Set Collections: ...