牛客牛牛的数列

该博客介绍了如何解决一个算法问题,即给定一个数列,找到最多改变一个数就能使其成为严格上升子序列的最长连续子序列。博主分享了一种解题思路,通过两层循环计算每个数左侧和右侧的严格递增子串,并根据条件判断连接这些子串的可能性,从而找到最长子序列的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牛客498914620号的比赛主页 >  牛牛的数列 > 45576194

题目描述:牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。

解题思路:n个数有n个位子可以改变,通过一层循环遍历每一个数,再通过二层循环计算一层循环的数左侧严格递增子串的个数和右左侧严格递增子串的个数,再通过比较p[s+1]-p[s-1]<=1;若成立这两个子串不能连接通过max(sum1,sum2)+1选出最长子串,若不成立则可以连接sum=sum1+sum2+1;在考虑特殊情况当j=0时只判断右侧子串即可;

复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include<math.h>

#include<iostream>

using namespace std;

int main(){

     int a;

    cin>>a;

    int *p;

    p=new int [a];

    int max1=0;

    for(int i=0;i<a;i++) cin>>p[i];

    for(int j=0;j<a;j++){

        int sum1=1;

        int sum2=1;

        int sum=0;

        for(int s1=j+1;s1<a-1;s1++){

        if(p[s1]>=p[s1+1]) break;

        sum1++;

}

    for(int s2=j-1;s2>=0;s2--){

        if(p[s2]<p[s2-1]) break;

        sum2++;

}

    if(p[j+1]-p[j-1]<=1&&j>=1) sum=max(sum1,sum2)+1;

    else if(p[j+1]-p[j-1]>1&&j>=1) sum=sum1+sum2+1;

    if(j==0) sum=sum1+1;

    if(sum>max1) max1=sum;

    }

    cout<<max1;

    return 0;

}

 

测试点详情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值