这是我的程序#include"stdio.h"
int n,a[1001]={0},f[1001]={0},c[1001]={0},m;
int nounder(int k)
{int i,max=0,m=0;
if (k==0 || f[k])
return f[k];
else
{for (i=k-1;i>=0;i--)
if (a[k]<a[i])
max=max<nounder(i)?f[i]:max;
else
{m++;
c[m]=i;}
f[k]=max+1;
return f[k];
}
}
main()
{int i,j;
FILE *fin;
fin=fopen("ddlj.in","r");
fscanf(fin,"%d",&n);
for (i=1;i<=n;i++)
fscanf(fin,"%d",&a[i]);
printf("%d\n",nounder(n));
for (i=1;i<=n;i++)
if (i==c[i])printf("%d ",i);
fclose(fin);
getchar();getchar();
}
C++ 导弹拦截第二问做不出来
答案:1 悬赏:20 手机版
解决时间 2021-05-04 20:24
- 提问者网友:疯子也有疯子的情调
- 2021-05-03 21:08
最佳答案
- 五星知识达人网友:何以畏孤独
- 2021-05-03 22:15
很老的题目了..我用的是动态规划。。文件输出
Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)
Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。
Sample Input
300 250 275 252 200 138 245
Sample Output
5 2
#include <iostream>
using namespace std;
const short MAX = 20;
bool prove(short arr[]);
void solution(short arr[],short *a,short *b);//a为拦截数,b为需要设备数
int main(void)
{
short arr[MAX] = {0} , i = 0,a = 0,b = 0;
cout << "输入导弹高度:(输入0结束) " << endl;
do
{
cin >> arr[i];
i++;
}while(arr[i-1] != 0 && i<MAX);
solution(arr,&a,&b);
cout << "一套设备能够拦截的导弹数是: " << a << endl;
cout << "拦截全部导弹需要的设备数是: " << b << endl;
return 0;
}
bool prove(short arr[])
{
for(int i = 0;i<MAX;i++)
{
if ( arr[i] != 0)
{
return true;
}
}
return false;
}
void solution(short arr[],short *a,short *b)
{
do
{
int min = 0;
for(int i=0;i<MAX;i++)
{
if(arr[i] != 0)
{
min = arr[i];
arr[i] = 0;
break;
}
}
for(int i=0;i<MAX;i++)
{
if(arr[i] < min && arr[i] != 0 )
{
min = arr[i];
arr[i] = 0;
(*a)++;
}
}
(*b)++;
}while(prove(arr));
return ;
}
Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)
Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。
Sample Input
300 250 275 252 200 138 245
Sample Output
5 2
#include <iostream>
using namespace std;
const short MAX = 20;
bool prove(short arr[]);
void solution(short arr[],short *a,short *b);//a为拦截数,b为需要设备数
int main(void)
{
short arr[MAX] = {0} , i = 0,a = 0,b = 0;
cout << "输入导弹高度:(输入0结束) " << endl;
do
{
cin >> arr[i];
i++;
}while(arr[i-1] != 0 && i<MAX);
solution(arr,&a,&b);
cout << "一套设备能够拦截的导弹数是: " << a << endl;
cout << "拦截全部导弹需要的设备数是: " << b << endl;
return 0;
}
bool prove(short arr[])
{
for(int i = 0;i<MAX;i++)
{
if ( arr[i] != 0)
{
return true;
}
}
return false;
}
void solution(short arr[],short *a,short *b)
{
do
{
int min = 0;
for(int i=0;i<MAX;i++)
{
if(arr[i] != 0)
{
min = arr[i];
arr[i] = 0;
break;
}
}
for(int i=0;i<MAX;i++)
{
if(arr[i] < min && arr[i] != 0 )
{
min = arr[i];
arr[i] = 0;
(*a)++;
}
}
(*b)++;
}while(prove(arr));
return ;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯