轮(baler.pas/c/cpp)
【问题描述】
LongDD 新买的机器的内部结构大概算世界上最混乱的了,它不象普通的机器一
样有明确的内部传动装置,而是,N (2 <= N <= 1050)个齿轮互相作用,每个齿轮
都可能驱动着多个齿轮。
LongDD 记录了对于每个齿轮 i,记录了它的 3个参数:X_i,Y_i 表示齿轮中心
的位置坐标(-5000 <= X_i <= 5000; -5000 <= Y_i <= 5000);R_i 表示该齿轮的
半径(3 <= R_i <= 800)。驱动齿轮的位置为 0,0,并且 FJ 也知道最终的工作齿轮
位于X_t,Y_t。
驱动齿轮顺时针转动,转速为 10,000转/小时。你的任务是,确定传动序列中
所有齿轮的转速。传动序列的定义为,能量由驱动齿轮传送到工作齿轮的过程中用
到的所有齿轮的集合。对能量传送无意义的齿轮都应当被忽略。在一个半径为 Rd,
转速为 S 转/每小时的齿轮的带动下,与它相接的半径为 Rx 的齿轮的转速将为
-S*Rd/Rx转/小时。 S前的负号的意思是,一个齿轮带动的另一个齿轮的转向会与它
的转向相反。
LongDD 只对整个传动序列中所有齿轮速度的绝对值之和感兴趣,你的任务也就
相应转化成求这个值。机器中除了驱动齿轮以外的所有齿轮都被另外某个齿轮带动,
并且不会出现 2个不同的齿轮带动同一个齿轮的情况。
相信你能轻易地写个程序来完成这些计算:)
程序名: baler
【输入格式】
* 第1行: 3个用空格隔开的整数:N,X_t,Y_t
* 第2..N+1 行: 第i+1 描述了齿轮i的位置及半径:X_i,Y_i,以及R_i
【输入样例】
4 32 54
0 0 10
0 30 20
32 54 20
-40 30 20
【输入说明】
机器里一共有 4 个齿轮,位于 0,0 的是半径为 10 的驱动齿轮,它带动了位于
0,30的,半径为 20的某个齿轮。这个齿轮又间接带动了位于 32,54,半径为 20的
【问题描述】
LongDD 新买的机器的内部结构大概算世界上最混乱的了,它不象普通的机器一
样有明确的内部传动装置,而是,N (2 <= N <= 1050)个齿轮互相作用,每个齿轮
都可能驱动着多个齿轮。
LongDD 记录了对于每个齿轮 i,记录了它的 3个参数:X_i,Y_i 表示齿轮中心
的位置坐标(-5000 <= X_i <= 5000; -5000 <= Y_i <= 5000);R_i 表示该齿轮的
半径(3 <= R_i <= 800)。驱动齿轮的位置为 0,0,并且 FJ 也知道最终的工作齿轮
位于X_t,Y_t。
驱动齿轮顺时针转动,转速为 10,000转/小时。你的任务是,确定传动序列中
所有齿轮的转速。传动序列的定义为,能量由驱动齿轮传送到工作齿轮的过程中用
到的所有齿轮的集合。对能量传送无意义的齿轮都应当被忽略。在一个半径为 Rd,
转速为 S 转/每小时的齿轮的带动下,与它相接的半径为 Rx 的齿轮的转速将为
-S*Rd/Rx转/小时。 S前的负号的意思是,一个齿轮带动的另一个齿轮的转向会与它
的转向相反。
LongDD 只对整个传动序列中所有齿轮速度的绝对值之和感兴趣,你的任务也就
相应转化成求这个值。机器中除了驱动齿轮以外的所有齿轮都被另外某个齿轮带动,
并且不会出现 2个不同的齿轮带动同一个齿轮的情况。
相信你能轻易地写个程序来完成这些计算:)
程序名: baler
【输入格式】
* 第1行: 3个用空格隔开的整数:N,X_t,Y_t
* 第2..N+1 行: 第i+1 描述了齿轮i的位置及半径:X_i,Y_i,以及R_i
【输入样例】
4 32 54
0 0 10
0 30 20
32 54 20
-40 30 20
【输入说明】
机器里一共有 4 个齿轮,位于 0,0 的是半径为 10 的驱动齿轮,它带动了位于
0,30的,半径为 20的某个齿轮。这个齿轮又间接带动了位于 32,54,半径为 20的
工作齿轮,以及一个位于-40,30,半径同样为20 的冗余的齿轮。
【输出格式】
* 第1行: 输出所有在传动中起到作用的齿轮转速的绝对值,包括驱动齿轮和工作
齿轮。只需要输出答案的整数部分
【输出样例】
20000
【输出说明】
齿轮 位置 半径 转速
1 (0,0) 10 10,000
2 (0,30) 20 -5,000
3 (32,54) 20 5,000
------
齿轮转速绝对值之和:20,000
这道题是一个搜索
题很简单 但是我发先倒着搜比正向要快很多
正向的代码如下
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
int N;
int Ex, Ey, En;
int Sx, Sy, Sn, Sr;
struct rec
{
int x;
int y;
int r;
int num;
double v;
double ans;
}baler[1100];
bool Vst[1100];
rec Q[1500000];
void init_file()
{
freopen("baler.in", "r", stdin);
freopen("baler.out", "w", stdout);
}
void read_data()
{
scanf("%d%d%d", &N, &Ex, &Ey);
for(int i = 1; i <= N; i++)
{
int x, y, r;
scanf("%d%d%d", &x, &y, &r);
if (x == Ex && y == Ey)
{
En = i;
}
if (x == 0 && y == 0)
{
Sn = i;
Sr = r;
}
baler[i].x = x;
baler[i].y = y;
baler[i].num = i;
baler[i].r = r;
}
}
bool check(rec a, rec b)
{
if ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) == (a.r + b.r) * (a.r + b.r)) return 1;
return 0;
}
void work()
{
int l = 1;
int r = 1;
Q[r].x = 0;
Q[r].y = 0;
Q[r].num = Sn;
Q[r].r = Sr;
Q[r].v = 10000;
Q[r].ans = 10000;
//printf("\n%lf\n", Q[r].ans);
Vst[Sn] = 1;
while(l <= r)
{
rec p;
p = Q[l];
l++;
if (p.num == En)
{
printf("%.lf\n", p.ans - 0.5);
}
for(int i = 1; i <= N; i++)
{
if (check(p, baler[i]) && !Vst[baler[i].num])
{
r++;
Q[r] = baler[i];
Q[r].v = p.v * (p.r / (double)baler[i].r);
Q[r].ans = p.ans + Q[r].v;
Vst[baler[i].num] = 1;
}
}
}
}
int main()
{
init_file();
read_data();
work();
return 0;
}