导弹拦截系统

Description:

假设你现在要为带有雷达的导弹拦截系统写一个判断程序,需要判断是否发射导弹拦截或者目标还有多久进入拦截区。

导弹发射井中一次填装有三枚导弹,每一枚导弹拦截半径为200km,拦截半径以内的范围即为拦截区,拦截区内的敌方目标均要拦截。

Input:

程序的输入数据是雷达传递过来的参数。

第一个参数N表示雷达捕获的目标数。

接下来传递N组参数。每组参数第一个数据判断敌友,要么为0表示敌方器械,要么为1表示己方器械。第二个数据表示雷达发射波段的原始频率f0,第三个数据表示雷达接收反射波的频率f1。f0、f1的单位都是吉赫兹(GHz),且在1~15之间,为了保证精度,小数点后保留八位。由相对论计算可知,f0、f1与目标的相对速度v(m/s)之间满足关系式f1=f0·(c+v)/(c-v),式中c表示光速,取c=299792458m/s,目标靠近雷达时v取正,反之取负。第四个数据是接收反射波与发射波之间的时间差,单位微秒(μs=10-6s)。

Output:

根据每组数据确定是否需要导弹出击拦截,导弹拦截最近的三个目标。若是暂时在拦截区外不需要出击拦截,则需计算出还有多长时间有目标进入拦截区(假设目标不改变航向、航速)或者是否朝向拦截区。

根据N组数据,对应输出对于每个目标的处理。共有五种情况:

拦截(YES)

不拦截:己方(NO:ONE OF US)

不拦截:下一次拦截(NO:NEXT TIME)

不拦截:(进入拦截区时间,单位秒(保留4位小数))

不拦截:远离(NO:AWAY)

Sample Input:

7

1
3.00000000
3.00001401
1334

0
3.00000000
3.00001402
1200

0
3.00000000
2.99998997
1321

0
2.99998997
3.00000000
1200

0
2.99998997
3.00000000
1225

0
3.00000000
3.00001103
1400

0
2.99998997
3.00000000
1250

Sample Output:

Target1:NO:ONE OF US
Target2:YES
Target3:NO:AWAY
Target4:YES
Target5:YES
Target6:NO:17.8813
Target7:NO:NEXT TIME

#include <iostream>

using namespace std;

const double C = 299792458;

/**
 * BY kkmd66
 * @return
 */

int main() {

    //N循环次数
    int N;

    //友方
    int flag;

    //输入参数
    double f0, f1, t, v;

    //有三枚导弹
    int count = 3;
    cin >> N;

    //N次循环
    for (int i = 0; i < N; ++i) {

        cin >> flag >> f0 >> f1 >> t;

        if (flag == 1) {
            cout << "Target" << i + 1 << ":NO:ONE OF US" << endl;
        }
        if (flag == 0) {
            v = C * (f1 - f0) / (f1 + f0);
            if (v < 0) {
                cout << "Target" << i + 1 << ":NO:AWAY" << endl;
            }
            if (v > 0) {
                double distance = C * t * 0.000001 / 2;
                if (distance <= 200000) {
                    if (count > 0) {
                        count--;
                        cout << "Target" << i + 1 << ":YES" << endl;
                    } else {
                        cout << "Target" << i + 1 << ":NO:NEXT TIME" << endl;
                    }
                } else {
                    double last_time = (distance - 200000) / v;
                    cout << "Target" << i + 1 << ":NO:" << last_time << endl;
                }
            }
        }

        //置零
        flag = 0;
        f0 = 0;
        f1 = 0;
        t = 0;
        v = 0;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值