前言:麻麻我会写状压DP了!

----------------------------

题目描述

愚人节到了!可爱的UOI小朋友要给孩子们送礼物(汗~原题不是可爱的打败图么= =..)。在平面直角坐标系上(欧氏的),有 N (N≤17)个点,分别代表 N 个小朋友的地理位置;还有一个点,这是UOI的家,UOI的所有礼物都放在这里,UOI必须驼着礼物从这里出发,送完礼物以后再返回这里,然后再拿出礼物出发。UOI身上每多驼一个礼物,他的速度就减半。已知他不驼礼物的速度是 V。为了不耽误(你懂的),UOI必须尽快完成这个任务。求完成任务的最短时间。

输入格式

第1行 1 个正整数,表示小朋友的个数。

以下 N+1 行每行两个整数,除第一个表示UOI的家以外,其他都表示一个小朋友的坐标。

最后一行一个整数 V,表示UOI的速度。

输出格式

输出一个整数,表示最短时间。四舍五入。

----------------------------------------------------------

作为一道变形的状压DP题,其转移方程还是比较简单的(亏我好几个小时都没想到QAQ)。我们首先证明一个结论:

要保证方案的最优性,每次最多只能携带两个礼物。

证明:假设现在原点为$O$,平面上有$A,B,C$三个点。假如我们一次性走完,那么费用是$8OA+4AB+2BC+CO$;如果我们先走$A$点,再走$B$点和$C$点,那么费用是$3OA+4OB+2BC+CO$,两式相减,得$5OA+4AB-4OB=OA+4(OA+AB-OB)$,在三角形$OAB$中$OA+AB-OB>0$,所以相减之后的式子是大于$0$的。得证选三个点不优。对于大于三个点的情况,可以类比成多个三角形和线段组合成的图形,证明方法是类似的。证毕。复杂度$O(n^2 2^n)$

状态转移方程:假设$1$表示不选,$0$表示选,则有:

$f[k]=\min (f[k],\min(f[k|(1<<(i-1)|1<<(j-1)]+cost(i,j),f[k|1<<(i-1)]+cost(i))$

约束条件:

if (!<<(i-)&k&&!<<(j-)&k)

注意开$long\ long$!!!!!!!!!!!(被这个卡了好久QAQ)

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x[],y[],v;
double f[],ans,dis[][];
double cal(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
double C1(int a,int b)
{
if (dis[][a]<dis[][b]) swap(a,b);
return (*dis[][b]+*dis[a][b]+dis[a][])/v;
}
double C2(int i)
{
return *dis[i][]/v;
}
signed main()
{
scanf("%lld",&n);
scanf("%lld%lld",&x[],&y[]);
for (int i=;i<=n;i++) scanf("%lld%lld",&x[i],&y[i]);
scanf("%lld",&v);
for (int i=;i<=n;i++)
for (int j=i;j<=n;j++) dis[i][j]=dis[j][i]=cal(i,j);
for (int i=(<<n)-;i>=;i--)
{
f[i]=1e18;
for (int j=;j<=n;j++)
{
if ((<<(j-))&i) continue;
for (int k=j+;k<=n;k++)
{
if ((<<(k-))&i) continue;
f[i]=min(f[i],f[i|(<<(j-))|(<<(k-))]+C1(j,k));
}
f[i]=min(f[i],f[i|(<<(j-))]+C2(j));
}
}
printf("%.0lf",f[]);
return ;
}

【FZYZOJ】愚人节礼物 题解(状压DP)的更多相关文章

  1. NOIP2016提高A组 A题 礼物—概率状压dp

    题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...

  2. O - Matching 题解(状压dp)

    题目链接 题目大意 给你一个方形矩阵mp,边长为n(n<=21) 有n个男生和女生,如果\(mp[i][j]=1\) 代表第i个男生可以和第j个女生配对 问有多少种两两配对的方式,使得所有男生和 ...

  3. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  4. NOIP2017 宝藏 题解报告【状压dp】

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...

  5. TZOJ 2289 Help Bob(状压DP)

    描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...

  6. 【bzoj5161】最长上升子序列 状压dp+打表

    题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...

  7. TZOJ 4912 炮兵阵地(状压dp)

    描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  8. POJ 1684 Corn Fields(状压dp)

    描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...

  9. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

随机推荐

  1. Spring IoC 公共注解详解

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 什么是公共注解?公共注解就是常见的Java ...

  2. 属性复制神器-mapstruct

    我们之前说到项目中会用到各种object,vo,bo,dto等等.我们需要在不同的对象上复制属性. 一.BeanUtils和PropertyUtils 我们最常用的就是Common包里面的BeanUt ...

  3. day19 生成器+函数递归

    目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...

  4. java学习第五天2020/7/10

    一. 今天继续学习算法: 1. 查找,一般我们采用的是顺序查找的方法,这种方法是比较简单,但是效率却很低:一般就是从第一个数开始与想要查找的那个数进行比较,当遇到相同的时候则就成功查找了: 另一种比较 ...

  5. 攻防世界ics-4

    靶场地址https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=4918&page=2 ...

  6. java 数据结构(十):Collection子接口:Set接口

    1. 存储的数据特点:无序的.不可重复的元素具体的: 以HashSet为例说明:1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的.2. 不可重复性 ...

  7. Kafka常用指令

    工作中经常会用到的指令   # 查询topic为test的partition数量 ./kafka-topics.sh --zookeeper localhost:2181/kafka --topic ...

  8. 通过server酱实现定时推送天气情况,再不用担心你的糊涂蛋女友忘带伞了~~

    昨天菜鸟小白给大家留了一个课后作业,如何实现天气的定时推送.有没有小伙伴做出来答案呢?今天菜鸟小白给大家分享我的实现方式吧.这个是我今天整的程序流程图,昨天我们还只是实现了中间的通过和风天气API获取 ...

  9. Java常用API(ArrayList类)

    Java常用API(ArrayList类) 我们为什么要使用ArrayList类? 为了更加方便的储存对象,因为使用普通的数组来存储对象太过麻烦了,因为数组的一个很大的弱点就是长度从一开始就固定了,所 ...

  10. Python Ethical Hacking - MAC Address & How to Change(1)

    MAC ADDRESS Media Access Control Permanent Physical Unique Assigned by manufacturer WHY CHANGE THE M ...