P2903 [USACO08MAR] The Loathesome Hay Baler S
题目描述
Farmer John 新买的干草打包机的内部结构大概算世界上最混乱的了,它不像普通的机器一样有明确的内部传动装置,而是 NNN 个齿轮互相作用,每个齿轮都可能驱动着多个齿轮。 FJ 记录了对于每个齿轮 iii,记录了它的 333 个参数,以一个三元组 (x,y,r)(x,y,r)(x,y,r) 表示,xxx 和 yyy 表示齿轮中心的位置坐标,rrr 表示该齿轮的半径。
驱动齿轮的位置为 (0,0)(0,0)(0,0),并且 FJ 也知道最终的工作齿轮位于 (Xt,Yt)(X_t,Y_t)(Xt,Yt)。 驱动齿轮顺时针转动,转速为 10,00010,00010,000 转/小时。你的任务是,确定传动序列中所有齿轮的转速。传动序列的定义为,能量由驱动齿轮传送到工作齿轮的过程中用到的所有齿轮的集合。对能量传送无意义的齿轮都应当被忽略。
在一个半径为 RdR_dRd,转速为 SSS 转/每小时的齿轮的带动下,与它相接的半径为 RxR_xRx 的齿轮的转速将为 −S×RdRx-S\times \frac{R_d}{R_x}−S×RxRd 转/小时。SSS 前的负号的意思是,一个齿轮带动的另一个齿轮的转向会与它的转向相反。
FJ 只对整个传动序列中所有齿轮速度的绝对值之和感兴趣,你的任务也就相应转化成求这个值。机器中除了驱动齿轮以外的所有齿轮都被另外某个齿轮带动,并且不会出现 222 个不同的齿轮带动同一个齿轮的情况。
输入格式
第一行,三个整数,分别代表 N,Xt,YtN,X_t,Y_tN,Xt,Yt;
第 222 行到第 N+1N+1N+1 行,每行三个整数,代表一个三元组 (x,y,r)(x,y,r)(x,y,r)。
输出格式
输出共一行,一个整数,代表整个传动序列中所有齿轮速度的绝对值之和。
输入输出样例 #1
输入 #1
4 32 54
0 0 10
0 30 20
32 54 20
-40 30 20
输出 #1
20000
C++实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1100;
struct node{//齿轮结构体
int x,y,r;
}c[maxn];
double v[maxn],ans[maxn];
bool vis[maxn];
int n,xt,yt,st,ed;
bool check(int x_1,int y_1,int r_1,int x_2,int y_2,int r_2){//计算两齿轮是否相切
if((x_1-x_2)*(x_1-x_2)+(y_1-y_2)*(y_1-y_2)<=(r_1+r_2)*(r_1+r_2)) return true;
else return false;
}
void dfs(int p){
if(p==ed) return;
for(int i=1;i<=n;i++){
if(check(c[p].x,c[p].y,c[p].r,c[i].x,c[i].y,c[i].r)==true&&(!vis[i])) {
vis[i]=1;
v[i]=v[p]*c[p].r/c[i].r;
ans[i]=ans[p]+v[i];
dfs(i);
vis[i]=0;
}
}
}
int main(){
cin>>n>>xt>>yt;//读入
for(int i=1;i<=n;i++){
cin>>c[i].x>>c[i].y>>c[i].r;
if((!c[i].x)&& (!c[i].y==0)) st=i;
if(c[i].x==xt && c[i].y==yt) ed=i;
}
v[st]=10000;
ans[st]=10000;
vis[st]=1;
dfs(st);
cout<<(int)ans[ed];
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
260

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



