题目描述

房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。

输入输出格式

输入格式:

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

输出格式:

一个数,表示要跑的最少距离,保留2位小数。

输入输出样例

输入样例#1:

4
1 1
1 -1
-1 1
-1 -1
输出样例#1:

7.41

代码

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std; map<int,double> m;
vector<int> G[];
vector<double> c[];
int N,vis[];
double ans=INF; struct cc{
double x,y;
}nod[]; double dis(int a,int b){
return sqrt((nod[a].x-nod[b].x)*(nod[a].x-nod[b].x)+(nod[a].y-nod[b].y)*(nod[a].y-nod[b].y));
} int look_up_table(double len){
long long H=;
for(int i=;i<=N;i++){
if(vis[i]) H=H*+i;
}
if(m.count(H)){
if(len>m[H]) return ;
m[H]=len;
return ;
}
else{
m[H]=len;
return ;
}
} void search(int x,int dep,double len){
if(len>=ans) return;
if(!look_up_table(len)) return;
if(dep==N){
ans=min(len,ans);
return;
}
vis[x]=;
// puts("$");
for(int i=;i<G[x].size();i++){
int now=G[x][i];
if(!vis[now]) search(now,dep+,len+c[x][i]);
} vis[x]=;
} int main(){
// freopen("01.in","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++){
cin>>nod[i].x>>nod[i].y;
//scanf("%lf",&nod[i].x,&nod[i].y);
}
nod[].x=nod[].y=0.0;
for(int i=;i<=N;i++){
for(int j=i+;j<=N;j++){
G[i].push_back(j);
c[i].push_back(dis(i,j)); G[j].push_back(i);
c[j].push_back(dis(i,j));
}
}
search(,,0.0);
printf("%.2lf",ans);
return ;
}

90分 的map>_<

//以上为map,意料之外啊

hash貌似不可以,因为自己的数据都过不了,就没有提交

至于评测的时候我觉得直接STL就好,hash试一试吧

看了下题解,我竟无言以对

回溯以及剪枝。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std; int N,vis[];
double ans=INF; struct cc{
double x,y;
}nod[]; double dis(int a,int b){
return sqrt((nod[a].x-nod[b].x)*(nod[a].x-nod[b].x)+(nod[a].y-nod[b].y)*(nod[a].y-nod[b].y));
} void search(int x,int dep,double len){
if(len>=ans) return;
if(dep==N){
ans=min(len,ans);
return;
} for(int i=;i<=N;i++){
if(i==x)continue;
if(!vis[i]){
vis[i]=;
search(i,dep+,len+dis(x,i));
vis[i]=;
}
} } int main(){
// freopen("01.in","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++)cin>>nod[i].x>>nod[i].y;
search(,,0.0);
printf("%.2lf",ans);
return ;
}

完了?

行吧,电脑渣13个点的数据用暴力都跑不出来怪谁咯

洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex的更多相关文章

  1. 洛谷 P1433 吃奶酪【DFS】+剪枝

    题目链接:https://www.luogu.org/problemnew/show/P1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处 ...

  2. 洛谷P1433 吃奶酪【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...

  3. 集训作业 洛谷P1433 吃奶酪

    嗯?这题竟然是个绿题. 这个题真的不难,不要被他的难度吓到,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的搜索就可以了. 这个题我用的深搜,因 ...

  4. 洛谷 - P1433 - 吃奶酪 - dfs

    https://www.luogu.org/problemnew/show/P1433 并不是每一个求最短距离就是bfs,这个肯定是dfs. 直接计算15!可以知道枚举必定超时,但是! 我们dfs非常 ...

  5. 洛谷 P1433 吃奶酪(记忆化)

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  6. 洛谷 P1433 吃奶酪

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  7. 洛谷P1433 吃奶酪 题解 状态压缩DP

    题目链接:https://www.luogu.com.cn/problem/P1433 题目大意 房间里放着 \(n\) 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 \((0, ...

  8. 洛谷P1433 吃奶酪

    #include<iostream> #include<math.h> using namespace std ; ; int n; bool st[N]; double x[ ...

  9. 洛谷 P1433 吃奶酪 状压DP

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

随机推荐

  1. C# virtual override 和 new 的区别

    一直以来我都对 virtual  override 和 new 之间的区别感到疑惑不解. 特别笔试的时候特别容易考到,真的很容易弄错啊,畜生! 光看理论永远记不住,那不如写几行代码就懂了. 首先看看v ...

  2. 在ubuntu上搭建开发环境7---ubuntu安装JDK

    首先,当然是要下载了. 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 按 ...

  3. Python 写Windows Service服务程序

    1.需求 为什么要开发一个windows服务呢?之前做一个程序,必须要读取指定目录文件License, 因为其他程序也在读取这指定目录的License文件,且License不同时会修改License的 ...

  4. C# 一些常用的技巧代码

    1.字符串风格成字符数组: 比如将字符串:23$123$45$转换成int[]这样的数组,你该怎么转换?其实你不用写那么的for循环,只需要一句话: int [] Relst =Array.Conve ...

  5. AngularJS——依赖注入

    依赖注入    依赖注入(DI)是一个经典的设计模式, 主要是用来处理组件如何获得依赖的问题.关于DI,推荐阅读Martin Flower的文章(http://martinfowler.com/art ...

  6. pythonchallenge之C++学习篇-00

    前言 最近学习下C++,之前是python的用户,python解释器有诸多实现,其中最出名的要数C实现了,而且很多python的扩展模块可能要用C或者C++来写的,所以很有必要学习下C++了 为了避免 ...

  7. javascript 的基础笔记

    新手入門: alert的使用:   在alert中\xB0可以输出温度(centigrade)的符号,\xNN可以输入一些不能输入的特殊字符,NN是两个十六进制数,表示字符在latin-1 字符集中的 ...

  8. SurfaceView

    我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing surface embedded inside of ...

  9. jq获取后台json并解析

    参考: $(function () { $.ajax({ url: 'tsconfig.json', type: 'GET', dataType: 'json', timeout: 1000, cac ...

  10. Sublime text追踪函数插件:ctags 和php代码格式化

    转自:http://blog.csdn.net/zm2714/article/details/8076077 这两天一直纠结两款编辑器——eclipse和sublime Text. eclipse的p ...