代码:
#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;
}
注意:
- 单位转换;
- 在攻击范围内反向敌机也不进行攻击;
- 放射波与接受波的时间差一半才是需要飞的时间;
- 发射导弹按照距离,而不是时间先后顺序;(oj暂不检测)
- 小于3架,可以提前结束;(oj暂不检测)

2016

被折叠的 条评论
为什么被折叠?



