Algorithme de Niuke Zhou Zhoulian 1-Lucky Number Ⅱ (prétraitement, DFS)

 

Lien: https://ac.nowcoder.com/acm/contest/5086/E
Source: Niuke.com

Date limite: C / C ++ 1 seconde 2 langues secondes d' autres
restrictions de l' espace: C / C ++ 262144K, d' autres langues 524288K
64bit IO Format: LLD%

Description du titre

Définissez un nombre comme un chiffre porte-bonheur si et seulement si tous ses chiffres sont 4 ou 7.
Par exemple, 47, 744 et 4 sont des numéros porte-bonheur et 5, 17 et 467 ne le sont pas.
Définissez next (x) comme le premier chiffre porte-bonheur supérieur ou égal à x. Étant donné l, r, demander suivant (l) + suivant (l + 1) + ... + suivant (r-1) + suivant (r).

Entrez la description:

Deux entiers l et r (1 <= l <= r <= 1 000 000 000).

Description de la sortie:

Un nombre indique la réponse.

 

Exemple 1

Entrée

2  7

Sortie

33
 
Exemple 2

Entrée

7  7

Sortie

7

 

 

En écrire un:

De toute évidence, la valeur suivante dans une plage est la même.

Nous pouvons mettre les valeurs suivantes possibles dans l'ordre croissant dans un conteneur vectoriel grâce au prétraitement. Selon la plage de données 1e9, faites également attention à y insérer 4444444444.

Nous utilisons lower_bound () pour trouver la première position dans le conteneur qui est supérieure ou égale à l. Ensuite, vous pouvez transmettre la relation entre le numéro porte-bonheur et la valeur r tout en étant ok.

 

1 #include <bits / stdc ++. H>
 2 typedef long  long LL;
3  #define pb push_back
 4  const  int INF = 0x3f3f3f3f ;
5  const  double eps = 1e- 8 ;
6  const  int mod = 1e9 + 7 ;
7  const  int maxn = 1e5 + 10 ;
8  utilisant l'  espace de noms std;
9  
10 vecteur <LL> vt;
11  
12  void init ()
 13 {
 14      pour ( int i = 1 ; i <= 9 ; i ++) // recherche tous les nombres porte-bonheur avec un total de i chiffres 
15      {
 16          pour ( int s = 0 ; s <( 1 << i); s ++) // Construire un nombre binaire s, le bit correspondant 1 représente le nombre 7, 0 représente le nombre 4 
17          {
 18              LL t = 0 ;
 19              pour ( int j = i- 1 ; j> = 0 ; j--) // parcourir chaque bit Lorsque vous faites attention, vous devez revenir en arrière 
20              {
 21                  si (( 1 << j) & s) t = t *10 + 7 ; // Le bit correspondant est 1, la fin de t +7 
22                  sinon t = t * 10 + 4 ; // Le bit correspondant est 0, la fin de t +4 
23              }
 24              vt.pb (t);
 25          }
 26      }
 27      vt.pb ( 4444444444 ); // Selon la plage de données, les dix chiffres ne doivent être pris en compte, donc push_back 
28  }
 29  
30  int main ()
 31  {
 32      #ifdef DEBUG
 33      freopen ( " sample.txt " , " r" , stdin); // freopen (" data.out "," w ", stdout); 
34      #endif 
35      
36      init ();
 37      int l, r;
 38      scanf ( " % d% d " , & l, & r);
 39      int pos = lower_bound (vt.begin (), vt.end (), l) -vt.begin ();
 40      LL ans = 0 ;
 41      LL pre = l; // Le dernier chiffre porte-bonheur peut résoudre À quel nombre 
42      while (vt [pos] <= r)
 43      {
 44          ans + = (vt [pos] -pre + 1 ) * vt [pos]; //Ajouter la valeur suivante entre pré et le numéro porte-bonheur à ce moment 
45          pre = vt [pos] + 1 ; // Mettre à jour la pré-valeur au numéro porte-bonheur actuel + 1 
46          pos ++; // Prochain numéro porte-bonheur 
47      }
 48      ans + = ( r-pre + 1 ) * vt [pos]; // Ajouter le premier chiffre porte-bonheur plus petit que r à la valeur suivante entre r 
49      printf ( " % lld \ n " , ans);
 50      
51      return  0 ;
 52 }

 

 

 

En écrivant deux:

Puisqu'il n'y a que deux options pour chaque personne, il suffit de  prétraiter directement via  DFS .

 

1 #include <bits / stdc ++. H>
 2 typedef long  long LL;
3  #define pb push_back
 4  const  int INF = 0x3f3f3f3f ;
5  const  double eps = 1e- 8 ;
6  const  int mod = 1e9 + 7 ;
7  const  int maxn = 1e5 + 10 ;
8  utilisant l'  espace de noms std;
9  
10  LL a [maxn];
11  LL ans, l, r, cnt;
12  
13  nulDFS (LL x)
 14  {
 15      si (x> r * 10 + 4 ) retourne ;
16      if (x) a [++ cnt] = x;
17      DFS (x * 10 + 4 );
18      DFS (x * 10 + 7 );
19  }
 20  
21  int main ()
 22  {
 23      #ifdef DEBUG
 24      freopen ( " sample.txt " , " r " , stdin); //freopen ("data.out", "w", stdout); 
25      #endif 
26      
27      scanf ( " % lld% lld " , & l, & r);
 28      DFS ( 0 );
 29      sort (a + 1 , a + 1 + cnt);
 30      int pos = lower_bound (a + 1 , a + 1 + cnt, l) -a;
 31      LL ans = 0 ;
 32      LL pre = l; // Quel nombre peut être résolu par le dernier chiffre porte-bonheur 
33      while (a ( pos] <= r)
 34      {
 35         ans + = (a [pos] -pre + 1 ) * a [pos]; // Ajouter la valeur suivante entre pre et le chiffre porte-bonheur à ce moment 
36          pre = a [pos] + 1 ; // Mettre à jour la pré-valeur à la valeur courante Numéro porte-bonheur +1 
37          pos ++; // Numéro porte-bonheur suivant 
38      }
 39      ans + = (r-pre + 1 ) * a [pos]; // Ajoutez le premier numéro porte-bonheur plus petit que r à la valeur suivante 
40 entre r      printf ( " % lld \ n " , ans);
 41      
42      return  0 ;
 43 }

 

 

 

 

 

 

 

-

Je suppose que tu aimes

Origine www.cnblogs.com/jiamian/p/12741953.html
conseillé
Classement