一个很有趣的问题!求解!!

cskuku 2004-10-09 11:37:03

问题四:拦截导弹
问题描述:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹系统。

样例:
Input: 389 207 155 300 299 170 158 65
Output: 6(最多拦截导弹数)
2(要拦截所有导弹最少要配备的系统数)
运行示例:
INPUT: 300 250 275 252 200 138 245
OUTPUT: 5 2
INPUT: 181 205 471 782 1033 1058 1111
OUTPUT: 1 7
INPUT: 465 978 486 324 575 384 278 214 657 218 445 123
OUTPUT: 6 4
INPUT: 236 865 858 565 545 445 455 656 844 735 638 652 569 714 845
OUTPUT: 6 7
...全文
462 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwjj007 2004-10-11
  • 打赏
  • 举报
回复
将楼上一位朋友的加以修改,如下
但楼主给的例子中的
INPUT: 465 978 486 324 575 384 278 214 657 218 445 123
OUTPUT: 6 4 我计算应该5 5
INPUT: 236 865 858 565 545 445 455 656 844 735 638 652 569 714 845
OUTPUT: 6 7 我计算应该是 6 8
请楼主指教
#include <iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 100

int count =0;
int sum = 0;
int a[MAX] = {0};

typedef struct stack
{
int a[MAX];
int top;
}stack;

void clear(stack *mystack)
{
int i;
for(i=0;i<=mystack->top;i++)
{
mystack->a[i] = -1;
}
mystack->top = -1;
}

void push(stack *mystack ,int a)
{
mystack->top++;
mystack->a[mystack->top] = a;
}


int pop(stack *mystack)
{
int temp = mystack->a[mystack->top];
mystack->top--;
return temp;

}


void get_date()
{
int temp,i=0;
printf("请输入,以-1结束\n");
while(1)
{
scanf("%d",&temp);
fflush(stdin);
if(temp == -1)
{
break;
}
else if(temp == 0)
{
printf("错误数据,输入结束!\n");
break;
}
else
{
a[i++]=temp;
}
}
}

void get_array(int a[],stack *mystack)
{
int i,k,t=0;

push(mystack,a[0]);
for(i=1;a[i];i++)
{
if(a[i]<a[i-1])
{
push(mystack,a[i]);
t= t+1;
}
else
{
sum++;
t = t+1;
//k = mystack ->top+1;
if(count<t)
{
count = t;
}
t = 0;
clear(mystack);
push(mystack,a[i]);
int j = i-2;
int temp;
temp = a[i];
while(j>=0)
{
if (a[j]>temp)
{ t = t+1;
if (a[j-1]<a[j])
temp = a[j];
}
j--;
}
}
if(a[i+1] == 0)
{
sum++;
// k = mystack ->top+1;
t = t+1;
if(count<t)
{
count = t;
}
clear(mystack);
push(mystack,a[i]);


}

}
}

int main(int argc, char* argv[])
{
int i;
stack *mystack;

mystack = (stack*)malloc(sizeof(stack));
for(i=0;i<MAX;i++)
{
mystack->a[i] = 0;

}
mystack->top = -1;
for(i=0;i<80;i++)
{
printf("*");
}

printf("该程序可计算长数组序列中的最长非递增序列\n");
printf("首先输入数组数据,程序将输出最长子序列的长度和个数\n");
printf("该程序由电子科技大学zealot编写\n");

for(i=0;i<80;i++)
{
printf("*");
}
get_date();
get_array(a,mystack);
printf ("%d\n",sum);
printf("%d\n",count);
return 0;
}
  • 打赏
  • 举报
回复
那是用VC的结果。
berg65123068 2004-10-10
  • 打赏
  • 举报
回复
zealot_tang 你的stdafx.h?
mainSean 2004-10-10
  • 打赏
  • 举报
回复
强!
onlytornado 2004-10-10
  • 打赏
  • 举报
回复
一点也不懂。。。。
skfox 2004-10-10
  • 打赏
  • 举报
回复
qingyuan18(zealot_tang)所写的代码好像不对哦:)
我输入Input: 389 207 155 300 299 170 158 65
后输出的结果是2,5?
是不是只考虑到排列300 299 170 158 65
而没有考虑到389 300 299 170 158 65的情况?
我写了一段代码,犯了同样的错误,hoho
void Daodan(int nData[],int nNum)
{
int nTmpMaxNumOfDd=0,nMaxNumOfDd=0;
for(int i=0;i<nNum;i++)
{
int nTmp = nData[i];
nTmpMaxNumOfDd = 0;
for(int j=i;j<nNum;j++)
{
if(nData[j]<=nTmp)
{
nTmp = nData[j];
nTmpMaxNumOfDd++;
}
}
if(nMaxNumOfDd<nTmpMaxNumOfDd)
nMaxNumOfDd = nTmpMaxNumOfDd;
}
cout<<"Max number of daodan is "<< nMaxNumOfDd <<endl;

}
qingyuan18 2004-10-09
  • 打赏
  • 举报
回复
mark先!
RedCrow 2004-10-09
  • 打赏
  • 举报
回复
楼上聪明!
DuoFG 2004-10-09
  • 打赏
  • 举报
回复
动态规划

说第一问吧:设st(n)为数组中以第n个数为头的最长递减序列长度。st(n-1)=max(st(x1),st(x2)...st(xi))+1. 其中n<=xi<=N,并且数组中第xi个数要小于第n-1个数。可以用递归
brucegong 2004-10-09
  • 打赏
  • 举报
回复






先发制人才是王道!




hillman004 2004-10-09
  • 打赏
  • 举报
回复
这个国家的防御也太差了吧,何况都即将被人导弹袭击了,除非另外的系统也在拦截什么东西,否则都快被炸了,系统还在使用中?太不合情理了吧。
再说了,那这种问题来这种地方问,也太不给面子了吧,这种简单的问题自己想想不就明白了吗
以后问问题也要看场合,这好歹也是一个技术网,老大
hcj2002 2004-10-09
  • 打赏
  • 举报
回复
我好像见过这道题

^_^
cao12m 2004-10-09
  • 打赏
  • 举报
回复
要是我有导弹就先发到你家后院 叫你拦截看看你那是什么东东
  • 打赏
  • 举报
回复
问题比较简单,但我要吃饭了,你请客的话我就先给你写程序。
  • 打赏
  • 举报
回复
建议发射导弹打击敌人。
wanglianhui 2004-10-09
  • 打赏
  • 举报
回复
楼上的厉害!
qingyuan18 2004-10-09
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 100

int count =0;
int sum = 0;
int a[MAX] = {0};

typedef struct stack
{
int a[MAX];
int top;
}stack;

void clear(stack *mystack)
{
int i;
for(i=0;i<=mystack->top;i++)
{
mystack->a[i] = -1;
}
mystack->top = -1;
}

void push(stack *mystack ,int a)
{
mystack->top++;
mystack->a[mystack->top] = a;
}


int pop(stack *mystack)
{
int temp = mystack->a[mystack->top];
mystack->top--;
return temp;

}


void get_date()
{
int temp,i=0;
printf("请输入,以-1结束\n");
while(1)
{
scanf("%d",&temp);
fflush(stdin);
if(temp == -1)
{
break;
}
else if(temp == 0)
{
printf("错误数据,输入结束!\n");
break;
}
else
{
a[i++]=temp;
}
}
}

void get_array(int a[],stack *mystack)
{
int i,k;

push(mystack,a[0]);
for(i=1;a[i];i++)
{
if(a[i]<a[i-1])
{
push(mystack,a[i]);

}
else
{
sum++;
k = mystack ->top+1;
if(count<k)
{
count = k;
}
clear(mystack);
push(mystack,a[i]);
}
if(a[i+1] == 0)
{
sum++;
k = mystack ->top+1;
if(count<k)
{
count = k;
}
clear(mystack);
push(mystack,a[i]);

}

}
}

int main(int argc, char* argv[])
{
int i;
stack *mystack;

mystack = (stack*)malloc(sizeof(stack));
for(i=0;i<MAX;i++)
{
mystack->a[i] = 0;

}
mystack->top = -1;
for(i=0;i<80;i++)
{
printf("*");
}

printf("该程序可计算长数组序列中的最长非递增序列\n");
printf("首先输入数组数据,程序将输出最长子序列的长度和个数\n");
printf("该程序由电子科技大学zealot编写\n");

for(i=0;i<80;i++)
{
printf("*");
}
get_date();
get_array(a,mystack);
printf ("%d\n",sum);
printf("%d\n",count);
return 0;
}
julia_roberts200 2004-10-09
  • 打赏
  • 举报
回复
是不是导弹拦截系统的导弹飞行高度是不是和导弹的飞行高度一样那
NC217 2004-10-09
  • 打赏
  • 举报
回复
不是吧。这好像有点意思哦!!!!!!好玩。。。关注
lifan5748 2004-10-09
  • 打赏
  • 举报
回复
晕,导弹高度排序还要人来完成,要计算机干嘛
加载更多回复(5)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧