[unsolved]导弹拦截系统

代码:

#include <stdio.h>

#define c 299792458
#define MISSILE 3
struct fly{
    int tag;		//标记友军、敌军
    double f0;
    double f1;
    int dif;		//时间差
    int attack;		//威胁程度(具体看下面代码的备注)
    double v;		//飞机速度
    double len;		//飞机距离反导系统的位置
};

int main(){
    int n,min,flag;
    scanf("%d",&n);
    struct fly a[n];
    for(int i=0;i<n;i++){
        getchar();
        scanf("%d %lf %lf %d",&a[i].tag,&a[i].f0,&a[i].f1,&a[i].dif);
        a[i].v=(a[i].f1/a[i].f0-1)*c/(a[i].f1/a[i].f0+1)/1000;
        a[i].len=1.0*c*a[i].dif/2000000000;		//时间差的一半是路程
//        printf("Target%d:len = %lf\n",i+1,a[i].len);
        if(a[i].tag==0&&a[i].len<=200&&a[i].v>0)
            a[i].attack=2;          //attack=3,立刻拦截;2->下次拦截;
        else if(a[i].tag==0&&a[i].len>200&&a[i].v>0){
            a[i].attack=1;          //1->待进入拦截区;
        }
        else{
            a[i].attack=0;          //0->友方、反向
        }
//        printf("Target%d:attack = %d\n",i+1,a[i].attack);
    }

    for(int i=0;i<MISSILE;i++){       //导弹数量为3;
        min=-1;
        flag=-1;            //flag用于标记当前是否需要发射导弹
        for(int j=0;j<n;j++){
            if(a[j].attack==2){
                if(flag==-1){
                    min=j;
                    flag=1;
                }
                else if(a[min].dif>a[j].dif)
                    min=j;
            }
        }
        if(min>=0)
            a[min].attack=3;
        if(flag==-1)        //如果需要打击的敌机小于3架,提前结束循环;
            break;
    }

    for(int i=0;i<n;i++){
        if(a[i].attack==0){			//不攻击
            if(a[i].tag){		//是友军
                printf("Target%d:NO:ONE OF US\n",i+1);
            }
            else{		//反向敌机
                printf("Target%d:NO:AWAY\n", i + 1);
            }
        }
        else if(a[i].attack==1){
            printf("Target%d:NO:%.4lf\n",i+1,(a[i].len-200)/(a[i].v));
        }
        else if(a[i].attack==2){
            printf("Target%d:NO:NEXT TIME\n",i+1);
        }else if(a[i].attack==3){
            printf("Target%d:YES\n",i+1);
        }
    }

    return 0;
}

注意:

  1. 单位转换;
  2. 在攻击范围内反向敌机也不进行攻击;
  3. 放射波与接受波的时间差一半才是需要飞的时间;
  4. 发射导弹按照距离,而不是时间先后顺序;(oj暂不检测)
  5. 小于3架,可以提前结束;(oj暂不检测)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值