吃

奶

酪

吃奶酪

吃奶酪


题目描述

房间里放着

n

n

n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在

(

0

,

0

)

(0,0)

(0,0)点处。


输入

第一行有一个整数,表示奶酪的数量

n

n

n。

第 22 到第

(

n

+

1

)

(n+1)

(n+1) 行,每行两个实数,第

(

i

+

1

)

(i + 1)

(i+1) 行的实数分别表示第 i 块奶酪的横纵坐

x

i

,

y

i

x_i,y_i

xi​,yi​


输出

输出一行一个实数,表示要跑的最少距离,保留

2

2

2 位小数。


样例输入

4
1 1
1 -1
-1 1
-1 -1

样例输出

7.41

题目解析

这道题我们可以用状压DP做。对于,每两个点之间的距离,我们可以用欧氏距离来计算
对于两个点

(

x

1

,

y

1

)

(

x

2

,

y

2

)

(x_1,y_1) (x_2,y_2)

(x1​,y1​)(x2​,y2​)两点之间的距离公式为

s

q

r

t

(

(

x

1

−

x

2

)

∗

(

x

1

−

x

2

)

+

(

y

1

−

y

2

)

∗

(

y

1

−

y

2

)

)

sqrt ( (x_1-x_2) * (x_1-x_2) + (y_1-y_2) * (y_1-y_2) )

sqrt((x1​−x2​)∗(x1​−x2​)+(y1​−y2​)∗(y1​−y2​))


code

#include<cmath>

#include<stdio.h>

#include<iostream> 

#include<string.h>

#include<algorithm>

#define db double

using namespace std;

int n;
db ans=-1,x[20], y[20], f[20][35000]; db jl (db x1, db y1, db x2, db y2)
{
return sqrt ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} int main ()
{
scanf ("%d",&n);
memset(f,127,sizeof(f));
for (int i=1; i<=n; ++i) scanf("%lf%lf",&x[i],&y[i]);
for(int s=1;s<=(1<<n)-1;s++)
for(int i=1;i<=n;i++)
{
if((s&(1<<(i-1)))==0) continue;
if(s==(1<<(i-1))) {f[i][s]=0;continue;}
for(int j=1;j<=n;j++)
{
if((s&(1<<(j-1)))==0||i==j) continue;
f[i][s]=min(f[i][s],f[j][s-(1<<(i-1))]+jl(x[i],y[i],x[j],y[j]));
}
}
for(int i=1;i<=n;i++)
{
db s=f[i][(1<<n)-1]+jl(x[i],y[i],x[0],y[0]);
if(ans==-1||ans>s) ans=s;
}
printf("%.2lf\n",ans);
return 0;
}

[状压DP]吃奶酪的更多相关文章

  1. P1433 吃奶酪(洛谷)状压dp解法

    嗯?这题竟然是个绿题. 这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的状压dp就可以了. 是的状压dp. 这个题的数据加 ...

  2. 洛谷 P1433 吃奶酪 状压DP

    题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...

  3. hihocoder #1608 : Jerry的奶酪(状压dp)

    题目链接:http://hihocoder.com/problemset/problem/1608 题解:就是一道简单的状压dp由于dfs过程中只需要几个点之间的转移所以只要预处理一下几个点就行. # ...

  4. 状压DP之LGTB 与序列

    题目 思路 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭 \(A_i\)<=30,所以我们只需要考虑1-58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的, ...

  5. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

  6. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  7. 有关状压DP

    [以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] 引言 动态规划虽然已经是对暴力算法的优化,但在某些比较特别的情况下,可以通过一 ...

  8. 【BZOJ-1097】旅游景点atr SPFA + 状压DP

    1097: [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 1531  Solved: 352[Submit][Sta ...

  9. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

随机推荐

  1. deep copy & deep merge

    deep copy & deep merge JSON.parse(JSON.stringify(obj)); lodash https://lodash.com/docs/ https:// ...

  2. input number step

    input number step <!DOCTYPE html> <html> <body> <h1>The input step attribute ...

  3. Nestjs 修改dist目录

    修改tsconfig.json { "compilerOptions": { "outDir": "./server-dist", // 这 ...

  4. Baccarat中挖矿、兑换和做市的三角关系是什么?

    NGK在这波DeFi潮中,推出了Baccarat,为用户带来了流动性挖矿收益,今天笔者就讲一讲Baccarat中挖矿.兑换和做市的关系. 兑换和做市是什么关系呢?众所周知,换币者,是用一种货币去换另一 ...

  5. C++算法代码——奖学金

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1098 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学 ...

  6. MySQL 导入外部数据

    手工为数据库录入数据: 1 -- 使用数据库 2 use test; 3 4 -- 创建fruits数据表 5 create table fruits( 6 f_id char(10) not nul ...

  7. short i=1;i=i+1;为什么报错?

    先测试,看结果: 提示我们说不能将short类型的转化为int类型! 先不急着下结论,我们继续测试,用i+=1; 我们发现并没有报错,为什么同样是加1,会出现这样两种不同的结果呢? 查阅了一些资料,大 ...

  8. Basic认证时添加请求头

    http Basic认证 http协议定义的一种认证方式,将客户端id和客户端密码按照"客户端ID:客户端密码"的格式拼接,并用base64编 码,放在header中请求服务端, ...

  9. 微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别

    一.给data中的属性或对象或数组设置值,属性名不需要加引号 this.setData({ material: param, // 这里material为对象 } this.setData({   d ...

  10. 卧槽,好强大的魔法,竟能让Python支持方法重载

    1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...