2020寒假【gmoj1599】【GDKOI2004】【香樟树camphor】【最长不下降子序列+优化】

题目描述

被誉为江南四大名木之一的香樟树很有特色,它的树皮粗糙,质地却很均匀,从来没有白杨树的斑斑驳驳、没有柳树的肿瘤结节;树枝树干一分为二、二分为四一路长去,不会偷工减料也不会画蛇添足;树冠的形态是球形的,在天空中画出优美的曲线。 除了上述优点之外,香樟树还有一个秘密武器。那就是………它凭借朴实、厚重的优秀品格赢得了小狐狸的青睐!!! 话说有一天,小狐狸正在湖边散步,忽然一阵风吹来,她赶紧闭上眼睛。当她再次睁开眼睛时,发现美丽的湖畔多出了一排整齐的香樟树。小狐狸非常兴奋,她对每棵树都观察入微,并且数出了它们的叶子个数。她觉得如果相邻两棵树的叶子个数互素是不和谐的。因此小狐狸想从一排香樟树中选出若干棵,在满足相邻两棵树的叶子个数不互素的条件下,使得树尽量多。

输入

第一行一个正整数n,表示有n棵香樟树。 第二行n个正整数,第i个数表示第i棵香樟树叶子的个数。

输出

一个正整数,表示最多能选多少棵树。

样例输入

6
6 2 3 15 8 5

样例输出

4
数据范围限制

对于60%的数据n<=1000     
对于100%的数据 n<=100000,叶子个数<=100000
注意:选中的树不能改变其位置,即如果选中第(t1,t2,t3……tn)棵树 ,其中t1<t2<t3<……<tn则认为ti与ti+1相邻。

提示

选择第1、第3、第4和第6棵树

分析

其实就是类似最长不下降子序列!!!只是“不下降”的条件变化了,变成a[i]和a[j]的最大公因数大于1,而不是a[i]>a[j]。但是超时60pts。
咋优化?玄学!!
只要把j的1到i−1 改成i−log(i)∗2到i−1,就不会超时了…神奇qwq,我也不知为啥。。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100010],n,f[100010],ans;
int zdgys(int x,int y)
{
     if(x%y==0) return y;
     else return zdgys(y,x%y);//辗转相除 
}
int log(int x)
{
    int t=0;
    while(x>0)
    {
	    x=x/2;
	    t++;
    }
    return t;
}
int main()
{
    freopen("camphor.in","r",stdin);
    freopen("camphor.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
	    cin>>a[i];
	    f[i]=1;
    }
    for(int i=2;i<=n;i++)
    {
		for(int j=i-log(i)*2;j<=i-1;j++)
		{
			if(j>0)
			{
				if(zdgys(a[i],a[j])>1)
				{
					f[i]=max(f[i],f[j]+1);
				}
			}	    
		}	
    }
    for(int i=1;i<=n;i++)
    {
    	if(f[i]>ans) ans=f[i];
	}
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值