机器设备
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
Alpha 公司设计出一种节能的机器设备。它的内部结构是由 N 个齿轮组成。整个机器设备有 一个驱动齿轮,当启动它时,它立即按 10,000 圈/小时转速顺时针转动,然后它又带动与它相切 的齿轮反方向,即逆时针转动。齿轮之间互相作用,每个齿轮都可能驱动着多个齿轮,最终带动 一个工作齿轮完成相应的任务。 在这套设备中,记录了每个齿轮的圆心坐标和齿轮半径。已知驱动齿轮位于(0,0),最终的 工作齿轮位于(Xt, Yt)。 Alpha 公司想知道传动序列中所有齿轮的转速。所谓传动序列,即能量由驱动齿轮传送,最 后到达工作齿轮的过程中用到的所有齿轮。能量传送过程是,在一个半径为 R,转速为 S 圈/每小 时的齿轮的带动下,与它相切的半径为 R’的齿轮的转速为-S*R/R’ 转/小时。负号的意思是, 表 示按反方向转动。
已知,机器设备中除了驱动齿轮以外,所有齿轮都可能被另外某个齿轮带动,并且不会出现 2 个不同的齿轮带动同一个齿轮的情况。 你的任务是计算整个传动序列中所有齿轮的能量之和。即所有齿轮转速的绝对值之和。
-
输入
-
第一行: T 表示以下有 T 组测试数据(1≤T ≤8)
对每组测试数据:
第 1 行: N Xt Yt (2≤N ≤1100)
接下来有 N 行, Xi Yi Ri 表示 N 个齿轮的坐标和半径 i=1,2,….,N
( -5000 ≤Xi ,Yi ≤ 5000 3 ≤ Ri ≤ 1000 )
坐标以及半径是整数
输出
-
每组测试数据,输出占一行,即所有齿轮转速的绝对值之和 在double范围内,输出整数部分
样例输入
-
1 4 32 54 0 30 20 0 0 10 32 54 20 -40 30 20
样例输出
-
20000
-
这个题是一个搜索题,用BFS和DFS均可,求出最短路径就行了,难度不是很难,注意一开始的处理用double不要直接用Int就行了
-
#include<stdio.h> #include<math.h> #include<queue> #include<string.h> #define inf 0x3f3f3f3f #define maxn 50005 using namespace std; int s; int n,xt,yt; struct node { int x,y,flag; double zs,r,power; }ans[10000]; int panduan(int x1,int x2,int y1,int y2,double r1,double r2) { if(sqrt(pow((x1-x2),2)+pow((y1-y2),2))!=r2+r1) { return true; } else { return false; } } int bfs() { queue<node>q; ans[s].x=0; ans[s].y=0; ans[s].power=10000; ans[s].zs=10000; ans[s].flag=1; q.push(ans[s]); while(!q.empty()) { node z=q.front(); q.pop(); if(z.x==xt&&z.y==yt) { printf("%d\n",(int)z.power); return true; } for(int i=0;i<n;i++) { if(ans[i].flag==1) { continue; } else if(panduan(z.x,ans[i].x,z.y,ans[i].y,z.r,ans[i].r)||ans[i].flag==1) { continue; } else { ans[i].flag=1; ans[i].zs=(z.zs*z.r)/ans[i].r; ans[i].power=ans[i].zs+z.power; q.push(ans[i]); } } } } int main() { //freopen("C:\\input.txt","r",stdin); int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&xt,&yt); for(int i=0;i<n;i++) { scanf("%d%d%lf",&ans[i].x,&ans[i].y,&ans[i].r); ans[i].flag=0; if(ans[i].x==0&&ans[i].y==0) { s=i; } } bfs(); } return 0; }