牛客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; } |
测试点详情