精华内容
下载资源
问答
  • 怪盗基德的滑翔翼

    2017-09-22 13:41:21
    怪盗基德的滑翔翼 怪盗基德的滑翔翼怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破


    怪盗基德的滑翔翼

    怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。
    

    这里写图片描述

    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。
    假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?
    

    Input

    输入数据第一行是一个整数K,代表有K组测试数据。
    每组测试数据包含两行:第一行是一个整数N,代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h,按照建筑的排列顺序给出。
    

    Output

    对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。
    

    Sample Input

    3
    8
    300 207 155 299 298 170 158 65
    8
    65 158 170 298 299 155 207 300
    10
    2 1 3 4 5 6 7 8 9 10
    

    Sample Output

    6
    6
    9
    

    Range

    N < 100;
    0 < h < 10000;
    K < 100.
    

    Analvsis

    这一题其实是最长上生序列与最长下降序列的结合,需要求出最长上升序列的长度,与最小下降序列的长度,输出较大的那一个。
    (我第一次做的时候,就只求了最长下降序列并输出,不幸答案错误%>_<%)
    此为其一,其二,此题有多组测试数据,所以每一次使用数组后,养成一个好习惯,把数组清零。
    下面是清零函数及所需头文件(一维,二维需要循环清零);
    b[i](状态)是表示从第i个开始最长的下降或上升序列;
    h[i]表示第i个的高度
    
    memset(b,0,sizeof(b));//#include<cstring>
    memset(h,0,sizeof(h));

    有了状态,状态转移方程式就有了

    b[i]=max(b[j]+1,b[i]);

    于是 ·············································
    就有了代码的核心部分
    1.求最长下降序列

    for(int i=2;i<=k;i++)
                for(int j=1;j<i;j++)
                    if(h[j]>h[i])
                            b[i]=max(b[j]+1,b[i]);

    2.最长上升序列

    for(int i=k-1;i>=1;i--)
                for(int j=k;j>i;j--)
                    if(h[j]>h[i])
                            b[i]=max(b[j]+1,b[i]);

    接下来,我们发现 (⊙o⊙)…
    怎么找到这个最长下降序列(上升序列)呀?
    其实,只需要一个函数即可(或用循环枚举每一个,找出最大的)

    *max_element(b+1,b+k+1)+1;//b数组第1个下标开始到第k个数中,从中选出最大的数。

    有了这些,代码也可以实现了!!!

    Code

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int b[5005],h[5005];
    int main()
    {
        int p;
        scanf("%d",&p);
        for(int l=1;l<=p;l++)
        {
            memset(b,0,sizeof(b));
            memset(h,0,sizeof(h));
            int k;
            scanf("%d",&k);
            for(int q=1;q<=k;q++)
                scanf("%d",&h[q]);
            for(int i=2;i<=k;i++)
                for(int j=1;j<i;j++)
                    if(h[j]>h[i])
                            b[i]=max(b[j]+1,b[i]);
            int s1=*max_element(b+1,b+k+1)+1;
            memset(b,0,sizeof(b));
            for(int i=k-1;i>=1;i--)
                for(int j=k;j>i;j--)
                    if(h[j]>h[i])
                            b[i]=max(b[j]+1,b[i]);
            int s2=*max_element(b+1,b+k+1)+1;
            printf("%d\n",max(s1,s2));
        }
        return 0;
    }
    展开全文
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑...

    怪盗基德的滑翔翼

    题目

    怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。

    而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。

    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。

    不得已,怪盗基德只能操作受损的滑翔翼逃脱。

    假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。

    初始时,怪盗基德可以在任何一幢建筑的顶端。

    他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。

    因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。

    他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。

    请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

    输入格式

    输入数据第一行是一个整数K,代表有K组测试数据。

    每组测试数据包含两行:第一行是一个整数N,代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h,按照建筑的排列顺序给出。

    输出格式

    对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

    数据范围

    1K1001N1000<h<100001≤K≤100 \\ 1≤N≤100\\ 0<h<10000

    输入样例

    3
    8
    300  207  155  299  298  170  158  65
    8
    65  158  170  298  299  155  207  300
    10
    2  1  3  4  5  6  7  8  9  10

    输出样例

    6
    6
    9

    题解

    思路

    • 原问题可以分解为一次正向LIS和一次反向LIS,取得最大值即为最终答案
    #include <iostream>
    
    using namespace std;
    
    const int N = 105;
    int t, n, a[N], f[N], g[N];
    
    int main () {
        cin >> t;
        while (t --) {
            cin >> n;
            for (int i = 1; i <= n; i ++) {
                cin >> a[i];
                f[i] = g[i] = 1;
            }
            
            int res = 0;
            for (int i = 1; i <= n; i ++)
                for (int j = 1; j < i; j ++)
                    if (a[j] < a[i])
                        f[i] = max(f[i], f[j] + 1);
            
            for (int i = 1; i <= n; i ++) res = max(res, f[i]);
            
            for (int i = n; i >= 1; i --)
                for (int j = n; j > i; j --)
                    if (a[j] < a[i])
                        g[i] = max(g[i], g[j] + 1);
            
            for (int i = 1; i <= n; i ++) res = max(res, g[i]);
            cout << res << endl;
        }
        
        return 0;
    }
    
    展开全文
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有 NNN

    题目链接:AcWing1017.怪盗基德的滑翔翼

    1. 题目描述

    怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。
    而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。
    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。
    不得已,怪盗基德只能操作受损的滑翔翼逃脱。
    假设城市中一共有 NN 幢建筑排成一条线,每幢建筑的高度各不相同。
    初始时,怪盗基德可以在任何一幢建筑的顶端。
    他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。
    因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。
    他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。
    请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

    输入格式
    输入数据第一行是一个整数 KK ,代表有 KK组测试数据。

    每组测试数据包含两行:第一行是一个整数 NN,代表有 NN 幢建筑。第二行包含 NN 个不同的整数,每一个对应一幢建筑的高度 hh ,按照建筑的排列顺序给出。

    输出格式
    对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

    数据范围
    1K1001 \leq K \leq 100,
    1N1001 \leq N \leq 100,
    0<h<100000 < h < 10000

    输入样例:

    3
    8
    300 207 155 299 298 170 158 65
    8
    65 158 170 298 299 155 207 300
    10
    2 1 3 4 5 6 7 8 9 10
    

    输出样例:

    6
    6
    9
    

    2. 解题思路

    • 条件一:怪盗基德可以在任何一幢建筑的顶端。
    • 条件二:选择一个方向逃跑,但是不能中途改变方向。
    • 条件三:只能往下滑行。
    • 目标:尽可能多地经过不同建筑的顶部。

    由条件一可知:选择一个数。
    由条件二、三可知:从选择的数开始找一个下降的子序列。
    由目标可知:该子序列需最长。

    所以,由上述分析可知我们要求最长上升子序列,并且要在同一点上求最长下降子序列,由此可以得到答案。
    最长上升子序列分析可见:AcWing895_最长上升子序列

    3. 代码实现

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 110;
    
    int n;
    int a[N];
    int f[N];
    
    int main()
    {
        int T;
        scanf("%d", &T);
       
        while (T --)
        {
            scanf("%d", &n);
           
            for (int i = 1; i <= n; i ++ )
                scanf("%d", &a[i]);
            
            int res = 0;
            for (int i = 1; i <= n; i ++ )
            {
                f[i] = 1;
                for (int j = 1; j < i; j ++ )
                    if (a[j] < a[i])
                        f[i] = max(f[i], f[j] + 1);
                
                res = max(res, f[i]);
            }
            
            for (int i = n; i; i -- )
            {
                f[i] = 1;
                for (int j = n; j > i; j -- )
                    if (a[j] < a[i])
                        f[i] = max(f[i], f[j] + 1);
                        
                res = max(res, f[i]);
            }
            
            printf("%d\n", res);
        }
        
        return 0;
    }
    

    4. 时间复杂度

    O(KN2)O(KN^2)

    展开全文
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排...

     

    【题目描述】

    怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。

    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。

    假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

    【输入】

    输入数据第一行是一个整数K(K<100)

    ,代表有K

    组测试数据。

    每组测试数据包含两行:第一行是一个整数N(N<100)

    ,代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h(0<h<10000)

    ,按照建筑的排列顺序给出。

    【输出】

    对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

    【输入样例】

    3
    8
    300 207 155 299 298 170 158 65
    8
    65 158 170 298 299 155 207 300
    10
    2 1 3 4 5 6 7 8 9 10

    【输出样例】

    6
    6
    9
    // Created on 2020/2/16
    
    /*#include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <climits>*/
    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    const int idata=5000+5;
    const int idata2=100+5;
    int n,m;
    ll flag;
    int minn=INT_MAX,maxx=-1;
    //int cnt[idata];
    //int len[idata];
    //int show[idata];
    int step[idata];
    int judge;
    int sum;
    int length;
    //int x[idata],y[idata];
    
    int main()
    {
        int left[idata],right[idata];
        int i,j;
        int t;
        cin>>t;
        while(t--)
        {
            maxx=0;
            memset(left,0,sizeof(left));
            memset(right,0,sizeof(right));
            cin>>n;
            for(i=1;i<=n;i++)
            {
                cin>>step[i];
            }
    
            left[1]=1;
            for(i=2;i<=n;i++)
            {
                left[i]=1;
                for(j=1;j<=i-1;j++)
                {
                    if(step[i]<step[j]
                       &&left[i]<left[j]+1)
                    {
                        left[i]=left[j]+1;
                    }
                }
            }
    
            right[n]=1;
            for(i=n-1;i>=1;i--)
            {
                right[i]=1;
                for(j=i+1;j<=n;j++)
                {
                    if(step[j]>step[i]
                       &&right[i]<right[j]+1)
                    {
                        right[i]=right[j]+1;
                    }
                }
            }
    
            for(i=1;i<=n;i++)
                if(maxx<left[i])
                    maxx=left[i];
            for(i=1;i<=n;i++)
                if(maxx<right[i])
                    maxx=right[i];
    
            cout<<maxx<<endl;
        }
    
    
        return 0;
    }

     

    展开全文
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一....
  • openjudge 怪盗基德的滑翔翼

    千次阅读 2015-12-02 19:09:49
    4977:怪盗基德的滑翔翼 查看提交统计提问 ...怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一...
  • 总时间限制: 1000ms 内存限制: 65536kB ...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的
  • 14:怪盗基德的滑翔翼

    2017-04-11 12:06:22
    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成...
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排...
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市
  • 怪盗基德的滑翔翼 ...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一...
  • 4977:怪盗基德的滑翔翼 总时间限制:1000ms内存限制:65536kB 描述 ...怪盗基德是一个充满传奇色彩的怪盗,...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动...
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排...
  • 题目描述 描述 怪盗基德是一个充满传奇色彩...有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受...
  • 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却柯南小朋友识破了伪装,而他的滑翔翼的动力装置也柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

怪盗基德被上