描述
有一個兩端封閉的水平光滑直管道,假設其兩端分別在座標軸的0點和L點處,在0時刻,管道內有n個品質相同的彈性小球(球和管道的直徑相同且無限趨近於0),第i個小球在位置xi以速度vi運動(速度大於則是向L點方向運動,小於0則是向0點方向運動),當小球運動至邊緣(x=0或x=L)時就會原速反彈並使計數器加一,一開始計數器的值是0,問t0時刻計數器的值是多少。
-
輸入
-
輸入的第一行是一個整數,為資料的組數t(t<=20)。
對於每組資料,第一行是三個整數n、L、t0,都小於10000。接下來n行每行2個整數xi和vi,表示每個小球初始的座標和速度(0<xi<L且|vi|<100)。
-
輸出
-
對於每組資料,輸出一個整數,為計數器的值(剛好在t0時刻到達兩端的也會觸動一次計數器)。
-
範例輸入
2
1 10 5
5 10
1 10 1
1 -1
範例輸出
5
1
-
提示
-
1.光滑指沒有摩擦,彈性指碰撞沒有能量損失。
2.假設i和j發生碰撞,
則有能量守恒:
和動量守恒:
聯立上面2式可得: 和
腦筋急轉彎
#include<iostream>using namespace std;int main(){ int t; cin >> t; int x[ 10002 ]; int v[ 10002 ]; for ( int e = 0; e < t; e++ ) { int n, l, t0; cin >> n >> l >> t0; for ( int i = 0; i < n; i++ ) { cin >> x[ i ] >> v[ i ]; } int sum = 0; for ( int i = 0; i < n; i++ ) { if ( v[ i ] < 0 ) { if ( t0 * (-v[ i ] ) >= x[ i ] ) sum += ( (-v[ i ] ) * t0 - x[ i ] ) / l + 1; } else { if ( t0 * ( v[ i ] ) >= l - x[ i ] ) sum += ( v[ i ] * t0 - l + x[ i ] ) / l + 1; } } cout << sum << endl; } return 0;}