前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怪盗基德三角滑翔翼设计图_第一代怪盗基德

怪盗基德三角滑翔翼设计图_第一代怪盗基德

作者头像
全栈程序员站长
发布2022-09-21 21:04:32
2330
发布2022-09-21 21:04:32
举报

大家好,又见面了,我是你们的朋友全栈君。

最长上神子序列(nlogn)

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

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

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

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

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

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

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

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

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

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

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

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

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

数据范围 1≤K≤100, 1≤N≤100, 0<h<10000 输入样例:

代码语言:javascript
复制
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

输出样例:

代码语言:javascript
复制
6
6
9
代码语言:javascript
复制
#include<bits/stdc++.h>
#define x first
#define y second
#define send string::nops
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
const int M = 3 * N;
const int INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
vector<int> fup,fdown,a;
int len_up,len_down;
int main(){ 
   
    int T,n,x;
    cin>>T;
    while(T --){ 
   
        cin>>n;
        a.clear();
        fup.clear();
        fdown.clear();
        for(int i = 0;i < n;i ++){ 
   
            cin>>x;
            a.push_back(x);
        }
        for(int i = 0;i < n;i ++){ 
   
            if(i == 0){ 
   
                fup.push_back(a[i]);
                continue;
            }
            int pox = upper_bound(fup.begin(),fup.end(),a[i]) - fup.begin();
// cout<<pox<<endl;
            if(pox != fup.size())fup[pox] = a[i];
            else fup.push_back(a[i]);
        }
        reverse(a.begin(),a.end());
        for(int i = 0;i < n;i ++){ 
   
            if(i == 0){ 
   
                fdown.push_back(a[i]);
                continue;
            }
            int pox = upper_bound(fdown.begin(),fdown.end(),a[i]) - fdown.begin();

            if(pox != fdown.size())fdown[pox] = a[i];
            else fdown.push_back(a[i]);
        }
        cout<<max(fdown.size(),fup.size())<<endl;
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168790.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最长上神子序列(nlogn)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档