欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1-9 最长连续递增子序列 (20分)(好难?)

程序员文章站 2022-06-08 08:12:30
...

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

输入格式:
输入第1行给出正整数n(≤10​5);第2行给出n个整数,其间以空格分隔。

输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。

输入样例:

15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10

输出样例:

3 4 6 8

这道题好难。。倒不是思路难想,就是测试点和对一些测试的数据处理的不好,改了一些测试点,改一回多两分,最后全顺序还是在别人的帮助下找出的,唉,20分的题,按理说不应该被卡的这么惨,但事实就是这样。它只是说了n的范围,没说输入的整数的范围,防止麻烦,我一开始就直接定义了long long类型

1-9 最长连续递增子序列 (20分)(好难?)

#include <iostream>
using namespace std;

typedef long long ll;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	ll a[n];
	for(int i = 0;i<n;i++){
		cin >> a[i];
	}
	if(n==1){
		cout << a[0];
		return 0;
	}
	int maxn = -1;
	int start,end;
	for(int i = 0;i<n;i++){
		int len = 0;
		for(int j = i+1;j<n;j++){
			if(a[j]>a[j-1]){
				len++;
				if(j == n-1){
					for(int k = i;k<=j;k++){
						cout << a[k];
						if(k<j) 
							cout <<" ";
					}
					return 0;
				}
			} else{
				if(len>maxn){
					maxn = len;
					start = i;
					end = j-1;
				}
				break;
			}
		}
	}
	for(int i = start;i<=end;i++){
		cout << a[i];
		if(i<end) 
			cout <<" ";
	}
	return 0;
}