首页 > 其他分享 >P1433 吃奶酪(C语言)

P1433 吃奶酪(C语言)

时间:2025-01-11 13:01:58浏览次数:3  
标签:ps point int double 奶酪 C语言 P1433 ans dis

题目描述

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

输入格式

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

第 2 到第 (n+1) 行,每行两个实数,第 (i+1)(i+1) 行的实数分别表示第 ii 块奶酪的横纵坐标 xi,yi。

输出格式

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

输入输出样例

输入 #1

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

输出 #1

7.41

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤n≤15,∣xi∣,∣yi∣≤200,小数点后最多有 3 位数字。

提示

对于两个点 (x1,y1),(x2,y2),两点之间的距离公式为 (x1−x2)^2+(y1−y2)^2​。


2022.7.13:新增加一组 HackHack 数据。

运用的相关知识以及自我理解

1.dfs。

2.状态压缩。

        这个第一次看见也不要觉得这有多难就是一个二进制来表示一种状态。将输入的点从0开始编号当这个点被走过就将其对应的数位写为1,再将其转化为十进制来表示现在已经走过的点。

3.剪枝。

        之前提到了一个状态当状态的由来是不为一的(相同的两个点可能先走或者后走,但是走完两个点后的状态是相同的那就意味着后面可能是会进行相同的操作),所以我们需要将这种情况减去,我们再仔细想一下如果我们到达该状态所走的路程小于已经存储的路程那后面的路程不就一定会大于已经储存的答案吗。

#include<stdio.h>
#include<math.h>
int n;
double ans,f[16][35000];
struct point
{
	double x,y;
	int visit;
	int num;
}ps[16];
double dis(point a,point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void dfs(point p,int step,int mark,double s)
{
	if(step==n)
	{
		if(ans>s)ans=s;
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(ps[i].visit==1)continue;
		int tmp=mark+(1<<i);
		if(f[i][tmp] == 0 || f[i][tmp] > f[p.num][mark] + dis(ps[i],p))
		{
			f[i][tmp] = f[p.num][mark] + dis(ps[i],p);
			ps[i].visit=1;
			dfs(ps[i],step + 1,tmp,s + dis(ps[i],p));
			ps[i].visit=0;
		}
	}
}
int main()
{
	scanf("%d",&n);
	ans=999999999;
	for(int i=0;i<n;i++)
	{
		scanf("%lf %lf",&ps[i].x,&ps[i].y);
		ps[i].visit=0;
		ps[i].num=i;
	}
	point p={0,0,1,0};
	dfs(p,0,0,0);
	printf("%.2lf",ans);
	return 0;
}

标签:ps,point,int,double,奶酪,C语言,P1433,ans,dis
From: https://blog.csdn.net/2403_87113072/article/details/145067983

相关文章

  • 嵌入式C语言:二维数组
    目录一、二维数组的定义二、内存布局2.1.内存布局特点2.2.内存布局示例2.2.1.数组元素地址2.2.2.内存布局图(简化表示)2.3.初始化对内存布局的影响三、访问二维数组元素3.1.常规下标访问方式3.2.通过指针访问3.2.1.指向数组首元素的指针3.2.2.指向单行元素......
  • 回顾c语言中main函数参数的妙用
    代码为:1#include<stdio.h>23intmain(intargc,char**argv)4{5inti=0;6for(i=0;i<argc;i++){7printf("%s\n",*(argv+i));8}9printf("%d\n",argc);10printf("%s\n",*ar......
  • C语言实现字符串替换函数
    #include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>//字符串替换函数/*********************************************************************Function:my_strstr()*Description:在一个字符串中查找一个子串;*Input:p......
  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • C语言分支和循环(上)
    分⽀和循环分⽀和循环(上)1.if语句1.1if1.2else2.关系操作符3.条件操作符4.逻辑操作符:&&,||,!5.switch语句分⽀和循环(上)C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • ubuntu 18.04下neovim手动添加treesitter支持(c语言为例)
    环境准备rustcurl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shnode.jshttps://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xzneovimhttps://github.com/neovim/neovim-releases/releases/download/v0.10.3/nvim-linux64.tar.g......
  • 【C语言输入输出】
    一、scanf()、printf()、putchar()、getchar();scanf(“输入控制符”,输入参数);1.功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。2.scanf是缓冲输入的,也就是说从键盘输入的数据都会先存放在内存中的一个缓冲区。......
  • C语言文件处理中的常见函数整理
    这里只是整理了一小部分常见的并附上了使用代码,希望对你有帮助!注意:这些函数都是建立在文件之上的,必须有打开文件、读写文件、关闭文件的流程才能使用一.顺序读写1.fputc从文件中读取一个字符写文件的原理:光标一开始在最开始的位置,读取/写入一个字符,就往后调一个光标......
  • C语言基础语法_03
    5、函数    函数就是程序中独立的功能,其实就是将程序打包,取一个名字,方便后面重复使用。函数的使用提高了代码的复用性和可维护性。 /*函数的定义:返回值类型函数名(形参1,形参2……){函数体;return返回值;}*/        首先先定义一个简单的不......