zoukankan      html  css  js  c++  java
  • 洛谷P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

    P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

    题目描述

    Farmer John has purchased the world's most loathesome hay baler. Instead of having a drive-roller that drives maybe an idler roller that drives the power take-off for the baler, it has N rollers (2 <= N <= 1050) which drive and are driven by various rollers.

    FJ has meticulously cataloged data for each roller i: X_i,Y_i are the center of the roller (-5000 <= X_i <= 5000; -5000 <= Y_i <= 5000); R_i is the roller's radius (3 <= R_i <= 800). The drive-roller is located at 0,0; the baler power take-off is located at X_t,Y_t (numbers supplied in the input).

    The drive-roller turns clockwise at 10,000 revolutions per hour. Your job is to determine the speeds of all the rollers that are in the power-train: from the drive-roller through the power take-off roller. Rollers that do not transfer power to the take-off roller are to be ignored. A roller of radius Rd that is turning at S rph and driving another roller of radius Rx will cause the second roller to turn at the speed -S*Rd/Rx (where the sign denotes whether the roller is turning clockwise or counterclockwise (anticlockwise for our British friends)).

    Determine the power-train path and report the sum of the absolute values of all those rollers' speeds. All the rollers in the input set except the driver-roller are driven by some other roller; power is never transferred to a roller from more than one other roller.

    Report your answer as an integer that is the truncated value after summing all the speeds.

    Farmer John新买的干草打包机的内部结构大概算世界上最混乱的了,它不象普通的机器一样有明确的内部传动装置,而是,N (2 <= N <= 1050)个齿轮互相作用,每个齿轮都可能驱动着多个齿轮。 FJ记录了对于每个齿轮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前的负号的意思是,一个齿轮带动的另一个齿轮的转向会与它的转向相反。

    FJ只对整个传动序列中所有齿轮速度的绝对值之和感兴趣,你的任务也就相应转化成求这个值。机器中除了驱动齿轮以外的所有齿轮都被另外某个齿轮带动,并且不会出现2个不同的齿轮带动同一个齿轮的情况。

    输入输出格式

    输入格式:
    • Line 1: Three space-separated integers: N, X_t, and Y_t

    • Lines 2..N+1: Line i+1 describes roller i's properties: X_i, Y_i, and R_i
    输出格式:
    • Line 1: A single integer that is the truncated version of the sum of the absolute value of the speeds of the rollers in the power-train including the drive-roller, all the driven rollers, and the power take-off roller.

    输入输出样例

    输入样例#1:
    4 32 54 
    0 0 10 
    0 30 20 
    32 54 20 
    -40 30 20 
    
    输出样例#1:
    20000 
    

    说明

    Four rollers: the drive-roller at 0,0 with radius 10. It drives the roller above it at 0,30 with radius 20. That roller drives both the power take-off roller at 32,54 (r=20) and a random roller (not in the power train) at -40,30 (r=20).

    Roller Radius Speed

    1 (0,0) 10 10,000

    2 (0,30) 20 -5,000

    3 (32,54) 20 5,000


    Sum of abs values: 20,000

    bfs一下就可以了。

    注意几个问题:

    1、相切才能联动!

    2、精度!用double!

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <queue>
    #include <cmath>
    
    const int sx = 1;
    const int sy = 1;
    const int K = 0;
    const int MAXN = 1050 + 10;
    
    int n,ex,ey;
    int pre[MAXN];  
    int start;
    int b[MAXN];
    
    
    struct T
    {
    	int x,y,r;
    	double energy, s;
    }circle[MAXN];
    
    inline bool IsPre(T& a, T& b)
    {
    	int d = (a.x - b.x)*(a.x - b.x)+ (a.y - b.y)*(a.y - b.y);
    	int sum = a.r + b.r;
    	return d == sum*sum;
    }
    
    void bfs()
    {
    	std::queue<T> q;
    	q.push(circle[start]);
    	b[start] = true;
    	while(!q.empty())
    	{
    		T temp = q.front();
    		q.pop();
    		for(int i = 1;i <= n;i ++)
    		{
    			if( !b[i] && IsPre(circle[i], temp))
    			{
    				b[i] = true;
    				circle[i].s =  temp.s * temp.r / circle[i].r;
    				circle[i].energy = circle[i].s + temp.energy;
    				if(circle[i].x  == ex && circle[i].y == ey)
    				{
    					printf("%d", (int)circle[i].energy);
    					return ;
    				}
    				q.push(circle[i]);
    			}
    		}
    	}
    }
    
    
    int main()
    {
    	scanf("%d%d%d", &n ,&ex, &ey);
    	ex += K;
    	ey += K;
    	for(int i = 1;i <= n;i ++)
    	{
    		scanf("%d%d%d", &circle[i].x, &circle[i].y, &circle[i].r);
    		circle[i].x += K;
    		circle[i].y += K;
    		if(circle[i].x == K && circle[i].y == K)
    		{
    			start = i;
    			circle[i].s = 10000;
    			circle[i].energy = 10000;
    		}
    	}
    	bfs();
    	return 0;
    }
    
  • 相关阅读:
    实现一个简单的ConnectionPool
    并发连接MySQL
    C#里面滥用String造成的性能问题
    String.IndexOf
    C#代码中插入X86汇编
    正确理解Handle对象
    orleans发送广播消息
    log日志方法
    PHP 批量插入数据
    逻辑漏洞小结之SRC篇
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6561472.html
Copyright © 2011-2022 走看看