1. 程式人生 > 其它 >2017年天梯賽大區賽題集 7-13 非常彈的球 (30 分)(物理)

2017年天梯賽大區賽題集 7-13 非常彈的球 (30 分)(物理)

技術標籤:2017年天梯賽大區賽題集物理學

剛上高一的森森為了學好物理,買了一個“非常彈”的球。雖然說是非常彈的球,其實也就是一般的彈力球而已。森森玩了一會兒彈力球后突然想到,假如他在地上用力彈球,球最遠能彈到多遠去呢?他不太會,你能幫他解決嗎?當然為了剛學習物理的森森,我們對環境做一些簡化:

  • 假設森森是一個質點,以森森為原點設立座標軸,則森森位於(0, 0)點。
  • 小球質量為w/100千克(kg),重力加速度為9.8米/秒平方(m/s^{2}​​)。
  • 森森在地上用力彈球的過程可簡化為球從(0, 0)點以某個森森選擇的角度ang(0<ang<π/2) 向第一象限丟擲,丟擲時假設動能為1000 焦耳(J)。
  • 小球在空中僅受重力作用,球縱座標為0時可視作落地,落地時損失p%動能並反彈。
  • 地面可視為剛體,忽略小球形狀、空氣阻力及摩擦阻力等。

森森為你準備的公式:

  • 動能公式:E=m×v^{2}​​/2
  • 牛頓力學公式:F=m×a
  • 重力:G=m×g

其中:

  • E- 動能,單位為“焦耳”
  • m- 質量,單位為“千克”
  • v- 速度,單位為“米/秒”
  • a- 加速度,單位為“米/秒平方”
  • g- 重力加速度

輸入格式:

輸入在一行中給出兩個整數:1≤w≤1000和1≤p≤100,分別表示放大100倍的小球質量、以及損失動力的百分比p。

輸出格式:

在一行輸出最遠的投擲距離,保留3位小數。

輸入樣例:

100 90

輸出樣例:

226.757

題意:

給定小球的動能,質量,和損失的動力百分比p,並以某一角度向上丟擲小球,小球在碰撞的過程會損失p%的動能,問小球最長的水平距離是多少

思路:

我們可以先求出水平距離的表示式(在不計算動能損失的情況下)

聯立len=v_{x} * tv_{y} = g * tv_{x} = v * \cos \thetav_{y} = v * \sin \thetaW = \frac{1}{2} * m * v^{2},得len = \frac{W * \sin 2\theta }{m * g}

\theta \in \left ( 0, \frac{\pi }{2}\right ),故當\theta = \frac{\pi }{4}時,長度取到最大值

最後就是簡單地模擬小球彈跳的過程了,每次碰撞動能W都會損失p%,隨後累加水平距離

注意最後的精度要求,保留三位小數,動能小於1e-8認為已經是零了,防止卡精度(第二個測試點)

並且由於上拋過程和下落的過程是對稱的,都有水平移動,所以最後的距離需要再乘上2

程式碼:

//7-13 非常彈的球 (30 分)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	double m , p;
	cin>>m>>p;
	m /= 100 , p /= 100;			//化為正確的形式 
	
	double w = 1000 , len = 0;		//初始話動能和總距離 
	while(w > 1e-8)					//防止double卡精度 
	{
		len += w / (m * 9.8);		//帶入距離公式 
		w *= (1 - p);				//動能損失 p%  
	}
	
	printf("%.3lf\n" , 2 * len);	//上拋和下降是對稱的,距離需要 * 2 
	return 0;
}