专栏文章
T637074 题解
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miosrl57
- 此快照首次捕获于
- 2025/12/03 00:33 3 个月前
- 此快照最后确认于
- 2025/12/03 00:33 3 个月前
注意到题目限制比较灵活(改了又改),很难统一构造方案,所以我们充分发扬人类智慧,用随机化,把点随机出来,但也不是乱随机,是有一定道理的随机。
前 个点要求比较少,只有一个限制:总长不超过 。举个例子,,设当前路程和为 ,如下图:

刚开始什么也没有,,科比从家出发。现在随机出来一个点 :

此时 ,我们再随机出来一个点 。

此时 ,我们要求 ,并没有超过,但这时候我们已经知道这样不行了。因为最后要回到原点,两点之间,线段最短,所以回到原点至少需要走 ,即最终 ,即 ,这不满足 的要求,所以我们重新随机一个点 :

此时 , 与原点之间的距离为 ,最终 ,符合要求,继续。
重点:此时已经有了 个点,再有 个点就够了,设最后一个点的坐标为 ,倒数第二个点的坐标为 , 表示坐标系上 与 之间的距离,最后一个点需要满足:
其中 为题目给的极小值 。因为 极小,所以我们干脆让上面的一堆等于 , 的误差留给浮点数的计算。
注意到 为已知数,有 两个未知数,只有一个方程,所以有无数组解,我们只需要其中一组或两组(原因见下)解就够了,所以不妨令 ,解出 ,再令 ,解出 ,就有两组解了:
注意到有分数,分母不能为 ,所以如果 就用第二组解,不然就用第一组解。
带入上面的例子 得 :

然后就可以敲代码了:
CPP#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<random>
#include<queue>
#include<ctime>
#include<map>
#define intu unsigned long long
#define intt long long
#define dlel long double
#define dle double
using namespace std;
const int Imax=0x7fffffffL;
const long long LLmax=0x7fffffffffffffffLL;
const dle Eps=1e-4;
mt19937 _rand(time(0));
dle Mod;
int n;
dle C;
dle c;
dle a,b,x,y;
dle dis(dle x1,dle y1,dle x2,dle y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}//两点间距离
int cnt;
map<dle,map<dle,bool> > mp;//记录某个点是否走过
dle Rand(dle p)//生成[0,p] 的浮点随机数
{
int m=_rand()%3;
dle res=_rand()/pow(10,m);
return res-((int)(res/p))*p;
}
int main()
{
scanf("%d%lf",&n,&C);
n++;
Mod=2*sqrt(C/3.14);//玄学?
cnt=1;
mp[0][0]=1;
while(1)
{
if(cnt==n-1)
{
dle k=C-c;
a=b=0;
if(fabs(x-k)<=Eps) b=(x*x+y*y-k*k)/(2*y-2*k);
else a=(x*x+y*y-k*k)/(2*x-2*k);
c+=dis(x,y,a,b)+dis(a,b,0,0);
printf("%lf %lf",a,b);
return 0;
}
a=b=Mod-0.001;
while(1)
{
a=Rand(a-0.001);
b=Rand(b-0.001);
if(cnt)
{
if(!a&&!x)//直走或调头
{
a=b=Mod-0.001;
continue;
}
else if(fabs(b/a-y/x)<=Eps)//直走或调头
{
a=b=Mod-0.001;
continue;
}
}
if(c+dis(x,y,a,b)+dis(a,b,0,0)<C&&!mp[a][b])
{
mp[a][b]=1;
break;
}
}
printf("%lf %lf\n",a,b);
c+=dis(x,y,a,b);
x=a;
y=b;
cnt++;
}
return 0;
}
当然有其它做法,你完全可以把它当数学题做,用到三角函数,比较考验思维和数学功底,但难度还是在绿左右。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...