NYOJ拦截导弹(最长递减子序列)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chimchim04/article/details/80360133

拦截导弹


题目描述:

某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。

输入描述:

第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。

输出描述:

输出最多能拦截的导弹数目

样例输入:

复制
2
8
389 207 155 300 299 170 158 65
3
88 34 65

样例输出:

6
2

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[105],f[105];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(f,0,sizeof(f));
        int n,ans=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=n-2;i>=0;i--)
         for(int j=i+1;j<n;j++)
            if(a[j]<a[i])
            f[i]=max(f[i],f[j]+1);
        for(int i=0;i<n;i++)
        ans=max(ans,f[i]);
        printf("%d\n",ans+1);
    }
    return 0;
}

拦截导弹

12-13

以下是我转贴rnrnrnrn问题描述:拦截导弹rn某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。rn输入导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹系统。rnrn样例:rnInput: 389 207 155 300 299 170 158 65rnOutput: 6(最多拦截导弹数)rn 2(要拦截所有导弹最少要配备的系统数)rn运行示例:rnINPUT: 300 250 275 252 200 138 245rnOUTPUT: 5 2rnINPUT: 181 205 471 782 1033 1058 1111rnOUTPUT: 1 7rnINPUT: 465 978 486 324 575 384 278 214 657 218 445 123rnOUTPUT: 6 4rnINPUT: 236 865 858 565 545 445 455 656 844 735 638 652 569 714 845rnOUTPUT: 6 7rn如样例1,打完389的高度后,可以有3个选择:207,155,300,为了考虑最多能打多少导弹,应该选择300的这个,接着后面的都能用这一个系统来拦截,应此最多拦截导弹rn数是6,另一个系统负责207,155。rn希望各位编好程序后能说明一下算法思想,好让小弟明白思路,逐渐学会编程的技巧。rn在此,小弟先谢谢各位了。rnrn

ACM 题目 - 最长上升子序列 - WA求助

06-26

http://acm.nit.net.cn/showproblem.jsp?pid=1557rnOJ地址,很多地方也有同样的题目....rn题目描述: rn一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1<= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。rnrn输入:rnrn多组cas , 每组cas 两行:rnrn第一行 输入一个数 n , 表示有n个数rnrn第二行 n个数, 分别代表每个数;rnrn输出rnrn每个cas 一行 输出 该书数列的最长的长度 ;rnrn输入样例:rnrn7rnrn1 7 3 5 9 4 8rnrn输出样例:rnrn4rnrn---------------rnO(n^2)貌似我会,O(nlogn)虽然网上有资料,看不太明白意思..rnrn求代码错误指正....总是Wa....rn是我的想法错了么?rnrn[code=C/C++]#include rnint G_iNumberList[1000000];rnint G_iNumberStat[1000000];rnint G_iNumberCount; rnint main() rn rn while (1 == scanf("%d", &G_iNumberCount)) rn rn int i, j; rn for (i = 0; i < G_iNumberCount; i++) rn rn scanf("%d", &G_iNumberList[i]); rn rn G_iNumberStat[0] = -99999999;rn G_iNumberStat[1] = G_iNumberList[0];rn int maxLength = 1;rn for (i = 1; i < G_iNumberCount; i++)rn rn if (G_iNumberStat[maxLength] > G_iNumberList[i])rn rn for (j = maxLength - 1; j >= 0; j--)rn rn if (G_iNumberStat[j] < G_iNumberList[i])rn rn if (G_iNumberStat[j + 1] > G_iNumberList[i])rn rn G_iNumberStat[j + 1] = G_iNumberList[i];rn rn rn rn rn elsern rn maxLength++;rn G_iNumberStat[maxLength] = G_iNumberList[i];rn rn rn printf("%d\n", maxLength); rn rn return 0; rn[/code]

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试