E 机器设备

机器设备

时间限制: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
来源
河南省第九届省赛
上传者

onlinejudge

解题思路:

我感觉此题的关键在于题意的理解,像题目给的测试数据,四个齿轮都是相切的,但是却没有把左上角的齿轮算上,(即能量由驱动齿轮传送,最 后到达工作齿轮的过程中用到的所有齿轮)知道题意就好做了。

此题可以抽象成一个图,求一个点到另一个点所用的能量。

刚开始我用的二维数组保存的齿轮圆心的坐标,提交错误,仔细看了一下我的代码和题意,齿轮圆心的坐标是-5000-5000,(二维数组下标无法满足),于是我改为结构体。广搜这部分就很简单啦。

提交还是错。。。。。无语了我

后来队友给我说最后的结果要向下取整,像5.5要取5,改了一下就AC啦。

提交之后我又看了一下题目,确实说了(即所有齿轮转速的绝对值之和 在double范围内,输出整数部分

#include<bits/stdc++.h>
using namespace std;
int R;
struct node
{
    int x,y,r;
    double v,sum;
    int flag;
} s,t[2105];
int n,ex,ey;
void bfs()
{
    queue<node>q;
    s.x=0;
    s.y=0;
    s.v=10000;
    s.sum=10000;
    s.r=R;
    q.push(s);
    s.flag=1;
    while(!q.empty())
    {
        node temp;
        temp=q.front();
        q.pop();
        if(temp.x==ex&&temp.y==ey)
        {
            long long int p;
            p=(long long int)temp.sum;
            printf("%lld\n",p);
            return;
        }
        for(int i=0; i<n; i++)
        {
            if(t[i].flag==0&&(t[i].x-temp.x)*(t[i].x-temp.x)+(t[i].y-temp.y)*(t[i].y-temp.y)==(t[i].r+temp.r)*(t[i].r+temp.r))
            {
                t[i].v=(temp.v*temp.r)*1.0/t[i].r;
                t[i].sum=temp.sum+t[i].v;
                t[i].flag=1;
                q.push(t[i]);
            }
        }
    }
}
int main()
{
    int num;
    scanf("%d",&num);
    while(num--)
    {
        scanf("%d%d%d",&n,&ex,&ey);
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].r);
            t[i].flag=0;
            if(t[i].x==0&&t[i].y==0)
                R=t[i].r;
        }
        bfs();
    }
}


posted @ 2017-04-19 08:05  X_na  阅读(139)  评论(0)    收藏  举报