sdut 2441屠夫と狼

4875 ワード


屠夫と狼
Time Limit: 1000ms   Memory limit: 65536K  質問は?ここをクリック^^;
タイトルの説明
タイトルリンク:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2441
  屠殺が遅く帰ると、肉を担いで尽き、骨が残っているのを止めて、狼の穴を通った.屠夫はオオカミの穴を発見した後、すぐにvpm/sで均一に逃げ、オオカミは屠夫がt秒逃げた後、vd/sの速度で均一に追いかけ、オオカミが屠夫に追いつくたびに、屠夫はすぐにオオカミに骨を投げ、オオカミはすぐに骨を拾って同じ速度で洞窟に戻り、f秒の時間をかけて骨を隠し、同じ速度で屠夫を追いかけ続けた.
洞窟を設置して屠夫の住まいからcメートル離れて、屠夫の担ぎの中で少なくともどれだけの骨が屠夫の安全な家に帰ることを保証することができますか?オオカミがちょうど屠夫が家の前に着いたときに追いつくと、骨を投げる必要はありません.
入力
入力された第1行は、データ群数を表す整数T(T<100)を含み、各データ群は、5個の整数、vp、vd、t、f、c(1)を含む ≤ vp,vd ≤ 100,1 ≤ t,f ≤ 10,1 ≤c ≤ 1000).
しゅつりょく
 各グループのデータは、必要な最小骨数を表す整数を含む行を出力します.
 
サンプル入力
2

1 2 1 1 10

1 2 1 1 8


サンプル出力
2

1

ヒント
 

 1 #include<stdio.h>

 2 int main()

 3 {

 4     int zong;

 5     scanf("%d",&zong);

 6     while(zong--)

 7     {

 8         double vp,vd,t,f,c;

 9         scanf("%lf%lf%lf%lf%lf",&vp,&vd,&t,&f,&c);

10         int sum=0;

11         if(vp<vd)

12         {

13             double x=vd*(vp*t)/(vd-vp);

14             while(x<c)

15             {

16                 sum++;

17                 x+=vp*(2*x+vd*f)/(vd-vp);

18             }

19         }

20         printf("%d
",sum); 21 } 22 return 0; 23 }

View Code
まず、最初のオオカミが屠夫に追いついたとき、屠夫が歩いた道のりを求めた.
オオカミがすでに歩いた時間を先に求めます:△t*vd=vp*(△t+t)、解は△t=vp*t/(vd-vp);
だから初めてオオカミが屠夫に追いついた時、すでに歩いた道のりはx=vd*△t=vd*(vp*t)/(vd-vp)だった.
大サイクル:
サイクルごとに代表が追いついたので、
オオカミがオオカミの巣に戻って骨を隠す時間は:x/vd+f;
オオカミがオオカミの巣に戻り、屠夫に追いつく時間が△tであると仮定すると、vd*[△t-(x/vd+f)]=x+vp*△t;
解得:△t=(2*x-vd*f)/(vd-vp);
この時間に屠夫が歩いた距離は△x=vp*△t=vp*(2*x-vd*f)/(vd-vp)である.
したがって、x=x+△x=x+vp*(2*x-vd*f)/(vd-vp);オオカミが再び屠夫に追いついたとき、屠夫がオオカミの巣から離れた距離で、テーマ全体が解けた.