(Jizhong) 1599] [camphrée GDKOI2004 (camphrier) [ne laissez pas tomber la plus longue séquence d'optimisation de +]

(Fichier IO): entrée: camphor.in sortie: camphor.out
limite: 1000 ms contraintes d'espace: 131072 KB restrictions spécifiques
Aller ProblemSet


Titre Description
camphrier connu comme l' un des quatre célèbres Jiangnan unique, son écorce rugueuse, la texture est très uniforme, jamais divisé tache marbrée de peuplier, de saule tumeur nodules non, un tronc sous-branche deux, deux à quatre long chemin à parcourir, ne pas couper les coins ne seront pas superflus, en forme de couronne sphérique, et tracer la courbe gracieuse dans le ciel. En plus des avantages ci - dessus, camphrier a une arme secrète. C'est ........................ Avec son simple, lourd bon caractère pour gagner la faveur d'un petit renard! ! ! Dire qu'un jour, un petit renard lac marche, tout d'un coup soudain de souffle du vent, elle se hâta de fermer les yeux. Quand elle ouvrit les yeux, et les trouva beau lac plus sur une rangée de camphrier soignée. Petit renard est très excitée, elle est observatrice de chaque arbre, et le nombre du nombre de leurs feuilles. Elle a estimé que si le nombre de feuilles de deux arbres adjacents premier à discordant. Ainsi , un petit renard comme ligne sélectionnée parmi la pluralité d'arbres de camphre, dans les conditions qui satisfont le nombre de feuilles adjacentes des deux arbres ne sont pas premiers entre eux, de sorte que l'arbre le plus possible.


Entrer
la première ligne un nombre entier positif n n , exprimé n n camphriers. La deuxième ligne n n un nombre entier positif, le je je le nombre i représente le nombre de feuilles d'arbres camphrier.

Sortie
un entier positif indiquant combien d'arbres jusqu'à l'élection.


entrée d' échantillon
. 6
. 6. 8 15. 5 2. 3

Exemple de sortie
4


limites de la plage de données
pour 60 60 % Données n < = 1000 n <= 1000     
Pour 100 100 % des données n < = 100000 n <= 100000 , le nombre de feuilles < = 100000 <= 100000
Note: l'arbre sélectionné ne peut pas changer sa position,savoir si le premier sélectionné ( t 1 , t 2 , t 3 ... ... t n ) (T1, T2, T3 ...... tn) l'arbre, dans lequel t 1 < t 2 < t 3 < ... ... < t n t1 <t2 <t3 <...... <tn considéré t je ti t je + 1 ti + 1 voisin.


Astuce
Sélection 1 1 , le premier 3 3 ,part 4 4 somme première 6 6 arbre


idées de résolution de problèmes
que nous ne pouvons pas trouver que c'est une de la séquence la plus longue chute! ! ! Nous des conditions a [ i ] > = a [ j ] a [i]> = a [j] dans a [ i ] a [ j ] a [i], a [j] est le plus grand diviseur commun de plus d'un, mais seulement 60 60 point. . En fait, nous pouvons j j s » 1 i 1 1 à i-1 changé i l o g ( i ) 2 i 1 i-log (i) * 2 i-1 到 , il ne sera pas chronométrer, mais ne me demandez pas pourquoi. .
A C AC pour aller de ~


code

#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);
}
Publié 119 articles originaux · a gagné les éloges 8 · vues 4906

Je suppose que tu aimes

Origine blog.csdn.net/kejin2019/article/details/105013833
conseillé
Classement