题解:AT_abc374_d [ABC374D] Laser Marking

题目传送门

思路

注意一下数据范围。

  • \(1 \le n \le 6\)

首先想到 dfs。


按照题意,先算出位置到线段的一段所需的时间。
再算出画线段所需的时间,就行了。
输出后发现与答案不一样,没关系,只要小数后六位是对的就行了。
记得要分情况,看先移动的线段的那一头。


代码

#include<bits/stdc++.h>
using namespace zh;
double ans=double(LLONG_MAX);
bool v[100];
int a[10000],b[10000],c[10000],d[10000];
int n,s,t;
void dfs(int x,int y,int z,double ss)
{
	if(z==n)
	{
		ans=min(ans,ss);
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(!v[i])
		{
			v[i]=1;
			double q1=sqrt(double(a[i]-x)*double(a[i]-x)+double(b[i]-y)*double(b[i]-y));
			double q2=sqrt(double(a[i]-c[i])*double(a[i]-c[i])+double(b[i]-d[i])*double(b[i]-d[i]));
			dfs(c[i],d[i],z+1,ss+q1/s+q2/t);
			q1=sqrt(double(c[i]-x)*double(c[i]-x)+double(d[i]-y)*double(d[i]-y));
			dfs(a[i],b[i],z+1,ss+q1/s+q2/t);
			v[i]=0;
		}
	}
}
int main(){
	//	ios::sync_with_stdio(false);
	//	cin.tie(),cout.tie();
	//	freopen(".in","r",stdin);
	//	freopen(".out","w",stdout);
	cin>>n>>s>>t;
	for(int i=1;i<=n;i++)
		cin>>a[i]>>b[i]>>c[i]>>d[i];
	dfs(0,0,0,0);
	printf("%.20lf",ans);
}
posted @ 2024-10-14 18:58  困死了要  阅读(8)  评论(0编辑  收藏  举报