给定人的位置和移动速度,求最快移动到同一点的时间.在一条直线上..
对于能否在同一个时刻全部点都相见,这个可以说是一个常用的套路了。
我原本还打算用扫描线 的。。
也有用三分过的,不懂原理。
#include<bits/stdc++.h>
using namespace std;
#define maxn 60010
double x[maxn],v[maxn];
int n;
bool judge(double tim)
{
double l=0,r=1e9;
double tl,tr;
for(int i=1;i<=n;++i)
{
tl=x[i]-v[i]*tim;
tr=x[i]+v[i]*tim;
if(tl>r||tr<l) return false;
l=max(l,tl);
r=min(r,tr);
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lf",&x[i]);
for(int i=1;i<=n;++i) scanf("%lf",&v[i]);
double lb=0,ub=1e9;
for(int i=0;i<100;++i)
{
double mid=(lb+ub)/2.0;
if(judge(mid)) ub=mid;
else lb=mid;
}
printf("%.10lf\n",ub);
return 0;
}
其实也知道是答案回事D+1.。
可是对于染色不会,看了别人,这样染色挺对的。
反正先在dfs 的时候就直接记录ans【】。然后while()判断会不会冲突。
#include<bits/stdc++.h>
using namespace std;
#define maxn 200100
int ans[maxn];
vector<int>g[maxn];
int fa[maxn];
int n;
int siz;
void dfs(int u,int pre)
{
int now=1;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(v==pre) continue;
while(now==ans[u]||now==ans[pre]) ++now;
ans[v]=now;
siz=max(siz,now);
now++;
dfs(v,u);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
ans[1]=1;
siz=1;
dfs(1,0);
printf("%d\n",siz);
for(int i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}
本文探讨了在一条直线上求最快相遇时间的问题,并提供了一种有效的算法实现。此外,还介绍了图论中的一种染色算法,用于解决图中的冲突问题。
842

被折叠的 条评论
为什么被折叠?



