我还有救吗?玄关
  • 板块P1433 吃奶酪
  • 楼主KellyH
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/1/24 19:33
  • 上次更新2025/1/24 22:27:40
查看原帖
我还有救吗?玄关
1367731
KellyH楼主2025/1/24 19:33

前情:在谷上刷题时,偶然遇见吃奶酪。一看:这不是机构网站的题吗?简简单单轻轻松松!学DFS时早就AC了!于是我复制+粘贴后发现居然40分!天塌了!
是乎:我来这里玄关求条(有注释贴心到位)
码子:

#include <bits/stdc++.h>
using namespace std;
//枚举全排列,打擂台找最少得距离
int n, r[15], c[15], vis[15], box[15];
double minans = 1e9;
void dfs(int cur)
{
	if(cur > n)
	{
		double ans = 0; //存储每种方案距离
		//生成全排列方案 注意是从0,0坐标开始
		for(int i = 1; i <= n; i++)
		{
			//根据横纵坐标计算斜边距离
			int x = r[box[i]] - r[box[i-1]];
			int y = c[box[i]] - c[box[i-1]];
			double t = sqrt(x*x + y*y);
			ans += t; //累加距离
		}
		//打擂台 最少距离
		minans = min(minans, ans);
		return ;
	}
	//扩展下一个盒子
	for(int i = 1; i <= n; i++)
	{
		if(vis[i] == 0) //没有被标记过
		{
			vis[i] = 1; //标记
			box[cur] = i;
			dfs(cur+1); //继续搜索下一个盒子
			vis[i] = 0; //回溯
		}
	}
}
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> r[i] >> c[i]; //输入行和列的坐标
	}
	//枚举全排列
	dfs(1); //从第一个盒子开始搜索
	cout << fixed << setprecision(2) << minans;
	return 0;
}

当然,最后还是爆出规定时间了……
本来一看别人的状压DP长代码感觉自己占了便宜,没想到啊……
今天还遭遇了你谷日爆

2025/1/24 19:33
加载中...