1 条题解
-
0
自动搬运
来自洛谷,原作者为

HiJ1m
**搬运于
2025-08-24 21:43:16,当前版本为作者最后更新于2017-10-08 08:09:39,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这个题数据范围N<=1050 , O(N²)的BFS,每次逐个计算两个齿轮的距离 ,实现过程很容易。
具体细节见代码注释。
P.S. 齿轮转的方向和结果好像没什么关系,于是我算的时候就没取相反数。
//Bzoj1615 麻烦的干草打包机 #include<bits/stdc++.h> #define MAXN 1084 struct cycle{ int x,y,r; }a[MAXN]; using namespace std; int N,xt,yt,st,ed,p[MAXN]; double s[MAXN],ans; bool vis[MAXN]; void BFS() { queue<int>q; vis[st]=1,s[st]=10000; //初值 q.push(st); while(!q.empty()) { int tmp=q.front();q.pop(); for(int i=1;i<=N;i++) { if(vis[i])continue; if((a[tmp].x-a[i].x)*(a[tmp].x-a[i].x)+(a[tmp].y-a[i].y)*(a[tmp].y-a[i].y)==(a[i].r+a[tmp].r)*(a[i].r+a[tmp].r)) { //上面这行是判断 距离的平方 是否等于 两齿轮半径和的平方 vis[i]=1; double t=a[tmp].r*1.0/a[i].r; //计算 s[i]=s[tmp]*t; p[i]=tmp; //这里说一下这个p数组是记路径用的,方便加和。 if(i==ed)return ; //跳出 q.push(i); } } } } int main() { scanf("%d%d%d",&N,&xt,&yt); for(int i=1;i<=N;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].r); if(a[i].x==0&&a[i].y==0)st=i; if(a[i].x==xt&&a[i].y==yt)ed=i; //存一下开始和结尾的位置 } BFS(); for(int i=ed;i;i=p[i]) ans+=s[i]; printf("%d",(int)ans); //这个地方要取整,四舍五入会WA30 return 0; } 博客链接http://www.cnblogs.com/Elfish/p/7634159.html
- 1
信息
- ID
- 1968
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者