[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;
}

浙公网安备 33010602011771号