[ABC374D] Laser Marking

[ABC374D] Laser Marking

题意

平面直角坐标系上有 \(N\) 条线段,你的初始位置在 \((0,0)\)。你需要画这 \(N\) 条线段。当你没落笔时的移动速度为 \(S\) 单位每秒,落笔时的速度为 \(T\) 单位每秒,且画线段时必须从线段的一段画到另一端,问画完 \(N\) 条线段的最小时间。

思路

\(N\le 6\),很明显直接 dfs 即可。

dfs 时要注意以下细节:

  • 记得将路程除以速度
  • 记得重置选过的线段标记(回溯)
  • 对于线段 \(AB\) 可以从 \(A\) 画到 \(B\),也可以从 \(B\) 画到 \(A\),需要考虑 \(2\) 次。

复杂度 \(O(N!2^N)\),可以通过。

代码

#include <bits/stdc++.h>
#define dis(x,y,xx,yy) (sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)))
using namespace std;
int n,s,t;
double ans;
struct node{
	int x,y,xx,yy;
}a[15];
bool vis[15];
void dfs(int nw,int lx,int ly,double tot){
	if(nw==n+1){
		ans=min(ans,tot);
		return;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			vis[i]=true;
			dfs(nw+1,a[i].xx,a[i].yy,tot+dis(lx,ly,a[i].x,a[i].y)/s+dis(a[i].x,a[i].y,a[i].xx,a[i].yy)/t);
			dfs(nw+1,a[i].x,a[i].y,tot+dis(lx,ly,a[i].xx,a[i].yy)/s+dis(a[i].x,a[i].y,a[i].xx,a[i].yy)/t);
			vis[i]=false;
		}
	}
}
signed main() {
	cin>>n>>s>>t;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].y>>a[i].xx>>a[i].yy;
	ans=INT_MAX;
	dfs(1,0,0,0);
	printf("%.10lf",ans);
	return 0; 
}
posted @ 2024-10-18 15:13  WuMin4  阅读(21)  评论(0)    收藏  举报