0%

SP26179 题解

一、题目解释

本题就是给定大炮和目标的位置以及炮弹速度、风速和风向,求出打中目标的时间。

二、题意分析

  • 由于需要考虑方向,我们不妨将右侧设为正,左侧设为负,即加上

    1
    2
    if (ct < cp) cbs *= -1;
    if (wd == 'L') ws *= -1;
  • 此时我们就可以将炮弹速度和风速加在一起,作为实际速度进行计算,即

    1
    t = (ct - cp) / (cbs + ws)
    • 特判

      • 如果大炮和目标在同一点上,那么时间就是 0 都把自己炸死了还管什么时间,所以

        1
        if (ct - cp == 0) cout << "0.000000";
      • 按照上面的步骤进行计算时,我们会发现若炮弹速度加风速等于零,则计算时会出现除以零,所以
        1
        if (cbs + ws == 0) cout << "Impossible";
  • 最后,我们加上保留小数输出即可(时间为负即不可能)

    1
    2
    if (t >= 0) cout << fixed << setprecision(6) << t;
    else cout << "Impossible";

三、AC Code

在上面的分析过后,我们已经理清了思路,接下来代码就不难了。

最后放上 AC 代码(注释就不写了,上面的说明挺详细的了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>

using namespace std;

int main() {
double cp, ct, cbs, ws;
char wd;
cin >> cp >> ct >> cbs >> ws >> wd;
if (ct < cp) cbs *= -1;
if (wd == 'L') ws *= -1;
if (ct - cp == 0) cout << "0.000000";
else if (cbs + ws == 0) cout << "Impossible";
else {
double t = (ct - cp) / (cbs + ws);
if (t >= 0) cout << fixed << setprecision(6) << t;
else cout << "Impossible";
}
return 0;
}