Consecutive Subsequence的题解

关于Consecutive Subsequence的题解

题目描述:

给定一个长度为n的整数数组。 你必须选择这个最大长度数组的某个子序列这样这个子序列就形成了一个递增的连续整数序列。换句话说,对于某个值x和长度k,所需的序列应该等于[x,x+1,…, x+k - 1]。 数组的子序列可以通过擦除数组中的一些(可能为零)元素来获得。你可以擦掉任何元素,不一定是连续的。其余元素保持它们的顺序。例如,对于数组[5,3,1,2,4],以下数组是子序列:[3],[5,3,1,2,4],[5,1,4],但是数组[1,3]不是。

第一部分:算出最长上升子序列

一个DP就可以(我就不放代码了)

第二部分:倒序输出

这一部分中我们知道最长上升子序列的结尾last和长度len。

就能知道开始的左边num = last - len + 1。

之后倒过来输出就行。
我也不放代码了(就是懒

总体代码如下:

#include<bits/stdc++.h>
using namespace std;
map<int, int> mk;
int a[200005];
int main(){
	int n,maxx=0,last;
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
		mk[a[i]]=mk[a[i] - 1] + 1;
		if(maxx<mk[a[i]]){
			maxx=mk[a[i]];
			last=a[i];
		}
	}
	cout<<maxx<<endl;
	int num=last-maxx+1;
	for(int i=1;i<=n;i++){
		if(a[i]==num){
			cout<<i<<" ";
			num++;
		}
	}
	return 0;
}
//freopen("ans.in","r",stdin);
//freopen("ans.out","w",stdout);

(本人代码习惯不太好,将就着看吧)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈美漩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值