(File IO): input:camphor.in output:camphor.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
被誉为江南四大名木之一的香樟树很有特色,它的树皮粗糙,质地却很均匀,从来没有白杨树的斑斑驳驳、没有柳树的肿瘤结节;树枝树干一分为二、二分为四一路长去,不会偷工减料也不会画蛇添足;树冠的形态是球形的,在天空中画出优美的曲线。 除了上述优点之外,香樟树还有一个秘密武器。那就是……………………它凭借朴实、厚重的优秀品格赢得了小狐狸的青睐!!! 话说有一天,小狐狸正在湖边散步,忽然一阵风吹来,她赶紧闭上眼睛。当她再次睁开眼睛时,发现美丽的湖畔多出了一排整齐的香樟树。小狐狸非常兴奋,她对每棵树都观察入微,并且数出了它们的叶子个数。她觉得如果相邻两棵树的叶子个数互素是不和谐的。因此小狐狸想从一排香樟树中选出若干棵,在满足相邻两棵树的叶子个数不互素的条件下,使得树尽量多。
输入
第一行一个正整数
n
n
n,表示有
n
n
n棵香樟树。 第二行
n
n
n个正整数,第
i
i
i个数表示第i棵香樟树叶子的个数。
输出
一个正整数,表示最多能选多少棵树。
样例输入
6
6 2 3 15 8 5
样例输出
4
数据范围限制
对于
60
60
60%的数据
n
<
=
1000
n<=1000
n<=1000
对于
100
100
100%的数据
n
<
=
100000
n<=100000
n<=100000,叶子个数
<
=
100000
<=100000
<=100000
注意:选中的树不能改变其位置,即如果选中第
(
t
1
,
t
2
,
t
3
…
…
t
n
)
(t1,t2,t3……tn)
(t1,t2,t3……tn)棵树 ,其中
t
1
<
t
2
<
t
3
<
…
…
<
t
n
t1<t2<t3<……<tn
t1<t2<t3<……<tn则认为
t
i
ti
ti与
t
i
+
1
ti+1
ti+1相邻。
提示
选择第
1
1
1、第
3
3
3、第
4
4
4和第
6
6
6棵树
解题思路
我们可以发现这就是一个最长不下降子序列!!!,我们只要将条件
a
[
i
]
>
=
a
[
j
]
a[i]>=a[j]
a[i]>=a[j]改成
a
[
i
]
,
a
[
j
]
a[i],a[j]
a[i],a[j]的最大公约数大于一,然而只有
60
60
60分。。其实我们可以将
j
j
j的
1
到
i
−
1
1到i-1
1到i−1改成
i
−
l
o
g
(
i
)
∗
2
到
i
−
1
i-log(i)*2 到i-1
i−log(i)∗2到i−1,就不会超时了,但不要问我为什么。。
A
C
AC
AC走起~~~
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int a[100010],n,f[100010],ans;
int check(int x,int y)
{
if(x%y==0)
return y;
else
return check(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);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&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(check(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];
printf("%d",ans);
}