最长不降子序列(二)

受到(一)中启发,现补充字节跳动19年第二次笔试第四题程序。

其中第一部分转载:空气质量题,作者:whl_program

题目如下:

4.一天,小凯同学震惊的发现,自己屋内的PM2.5指标是有规律的!小凯采样了PM2.5的数值,发现PM2.5数值以小时为周期循环,即任意时刻的PM2.5总是和一小时前相等!他的室友小文同学提出了这样一个问题,在t小时内的所有采样点中,选取若干采样点的数值,能否找到一个PM2.5不曾下降过的序列?这个序列最长是多少?

输入描述:

第一行有两个整数n t 表示每小时的采样点个数,和询问多少个小时的结果

第二行有n个整数,以空格分隔,表示一个小时内,每个采样点观测到的PM2.5的数值

示例:

输入

4   3

10   3   7  5

输出

4

说明

3小时内所有采样点为

10  3  7  5  10  3  7  5  10  3  7  5

选取第2 3 5 9个采样点,可以得到一个不曾下降过的序列

3  7  10  10

使用其他的方法也可以得到长为4的满足条件的序列,但无法得到长度超过4的结果

1、采用容器类的方式编写代码,参考以上提到的作者的博文,代码如下:

int main()
{
	int a,b;
	scanf("%d%d", &a, &b);
	vector<int> ans(a, 0),tmp(a,1);
	for (int i = 0;i<a;i++)
	{
		scanf("%d", &ans[i]);
	}
	for (int i = 1;i<a;i++)
	{
		for (int j = 0;j<i;j++)
		{
			if (ans[i]>=ans[j])
			{
				tmp[i] = max(tmp[i], tmp[j] + 1);
			}
		}
	}
	cout << *max_element(tmp.begin(), tmp.end())+b-1;
return 0;
}

2、第二部分-参考(一)种思路,采用数组的形式编写

int main
{	
        int a[40005];
	int d[40005];
	int n,t;
	scanf("%d",&n);
	scanf("%d",&t);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	if (n==0)  //0个元素特判一下 
	{
		printf("0\n");
		return 0;
	}
	d[1]=a[1];  //初始化 
	int len=1;
	for (int i=2;i<=n;i++)
	{
		if (a[i]>=d[len]) d[++len]=a[i];  //如果可以接在len后面就接上 
		else  //否则就找一个最该替换的替换掉 
		{
			int j=upper_bound(d+1,d+len+1,a[i])-d;  //找到第一个大于它的d的下标 
			d[j]=a[i]; 
		}
	}
	printf("%d\n",len+t-1);  
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值