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. 对于RBAC与shiro的一些思考

    一.什么是RBAC模型 RBAC模型是一个解决用户权限问题的设计思维. 在最简单的RBAC模型中,将用户表设计为如下几个表 1.用户 2.角色 3.权限 以及这三张表衍生出来的两张中间表 4.用户_角 ...

  2. 深入探索Spring Data JPA, 从Repository 到 Specifications 和 Querydsl

    数据访问层,所谓的CRUD是后端程序员的必修课程,Spring Data JPA 可以让我们来简化CRUD过程,本文由简入深,从JPA的基本用法,到各种高级用法. Repository Spring ...

  3. boston.csv 完整版 508个数据集

    https://pan.baidu.com/s/1C1Llx8cTu5xBdK9GuDZ11A 提取码:u6cm

  4. []Spring创建Bean的过程

    1. beans包提供了以编程方式管理和操作bean的基本功能,而context包增加了ApplicationContext,它以一种更加面向框架的方式增强了BeanFactory的功能. 2. co ...

  5. JavaScript变量污染

    定义过多的全局变量,有可能造成全局变量冲突,这种现象称为变量污染. 全局变量在全局作用域内外都是可见的.若是已经声明了一个全局变量,再以相同的关键字和标识符重新声明全局变量,后者的赋值会替代前者的赋值 ...

  6. kafka事务

    Kafka 从 0.11 版本开始引入了事务支持.事务可以保证 Kafka 在 Exactly Once 语义的基 础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败. 开启幂等性的 Pro ...

  7. UNP——第二章,TCP状态,TIME_WAIT

    状态可以用 netstat 验证 加粗线为 数据交换. 可以看出,TCP在 建立连接和 关闭连接,耗费资源, 因为UDP只需要两次数据通信即可. 但UDP没有可靠传输,和流量控制. 上面协商的MSS为 ...

  8. Markdown 常用语言关键字

    Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...

  9. 解决自动安装Freebsd系统盘符无法确定问题

    最近因为需要用到Freebsd,所以研究了打包的一些方法,这个没什么太大问题,通过网上的一些资料可以解决,但是由于确实不太熟悉这套系统,还是碰上了一些比较麻烦的地方,目前也没看到有人写如何处理,那就自 ...

  10. 单独编译一个ext4内核模块

    当我们需要使用一个内核模块的时候,在当前使用版本内核编译的时候又没有加进去,在不改变内核版本的时候,再编译整个内核,可能会覆盖原来的内核,导致系统无法启动 现在我们能够单独选择需要的模块,然后加载进内 ...