2017.2.09【初中部 提高組】模擬賽C組 香樟樹 題解

原題:

http://172.16.0.132/junior/#contest/show/1373/3

題目描述:

被譽爲江南四大名木之一的香樟樹很有特色,它的樹皮粗糙,質地卻很均勻,從來沒有白楊樹的斑斑駁駁、沒有柳樹的腫瘤結節;樹枝樹幹一分爲二、二分爲四一路長去,不會偷工減料也不會畫蛇添足;樹冠的形態是球形的,在天空中畫出優美的曲線。
除了上述優點之外,香樟樹還有一個祕密武器。那就是……………………它憑藉樸實、厚重的優秀品格贏得了小狐狸的青睞!!!
話說有一天,小狐狸正在湖邊散步,忽然一陣風吹來,她趕緊閉上眼睛。當她再次睜開眼睛時,發現美麗的湖畔多出了一排整齊的香樟樹。小狐狸非常興奮,她對每棵樹都觀察入微,並且數出了它們的葉子個數。她覺得如果相鄰兩棵樹的葉子個數互素是不和諧的。因此小狐狸想從一排香樟樹中選出若干棵,在滿足相鄰兩棵樹的葉子個數不互素的條件下,使得樹儘量多。

輸入:

第一行一個正整數n,表示有n棵香樟樹。
第二行n個正整數,第i個數表示第i棵香樟樹葉子的個數。

輸出:

一個正整數,表示最多能選多少棵樹。

樣例輸入:

6
6 2 3 15 8 5

樣例輸出:

4

提示:

樣例解釋:選擇第1、第3、第4和第6棵樹
數據範圍,對於60%的數據n<=1000
對於100%的數據 n<=100000,葉子個數<=100000
注意:選中的樹不能改變其位置,即如果選中第(t1,t2,t3……tn)棵樹 ,其中t1

分析:

我們可以發現這就是一個最長不下降子序列!!!,我們只要將條件a[i]>=a[j]改成gcd(a[i],a[j])>1,然而只有60分,數據告訴我!!!可以將j的1~i-1改成i-log(i)*2~i-1,AC走起~~~

實現:

uses math;
var
        n,i,j,ans:longint;
        f,a:array[0..100007]of longint;
function gcd(x,y:longint):longint;
begin
        if x mod y=0 then exit(y) else exit(gcd(y,x mod y));
end;
function lg(x:longint):longint;
var
        t:longint;
begin
        t:=0;
        while x>0 do begin x:=x div 2;  inc(T);end;
        exit(t);
end;
begin
        assign(input,'camphor.in');reset(input);
        assign(output,'camphor.out');rewrite(output);
        readln(n);
        for i:=1 to n do
        begin
                read(a[i]);
                f[i]:=1;
        end;
        for i:=2 to n do
                for j:=i-lg(i)*2 to i-1 do
                        if (j>0)then
                                if (gcd(a[j],a[i])>1) then f[i]:=max(f[i],f[j]+1);
        for i:=1 to n do
                if f[i]>ans then ans:=f[i];
        writeln(ans);
        close(input);close(output);
end.
發佈了89 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章