Numéro 31: Formation informatique - problèmes et défis actuels des grandes entreprises

Salut Salut! Nous avons à nouveau préparé pour vous une sélection de questions et de tâches intéressantes à partir d'entretiens avec des sociétés informatiques de premier plan! Soit dit en passant, les réponses aux problèmes du numéro précédent ont déjà été publiées .



Des problèmes apparaîtront chaque semaine - restez à l'écoute! La rubrique est soutenue par l'agence de recrutement Spice IT .

Cette semaine, nous avons collecté des tâches lors d'entretiens avec la société néerlandaise Philips.

Des questions


1. Poison et rat
Il y a 1000 bouteilles de vin. Une des bouteilles contient du vin empoisonné. Un rat meurt une heure après avoir bu le vin empoisonné. Combien de rats minimum sont nécessaires pour déterminer quelle bouteille contient du poison en une heure.

Transfert
1000 . . , . , , .

2. 5 pirates et 100 pièces d'or
There are 5 pirates, they must decide how to distribute 100 gold coins among them. The pirates have seniority levels, the senior-most is A, then B, then C, then D, and finally the junior-most is E.

Rules of distribution are:
  • The most senior pirate proposes a distribution of coins.
  • All pirates vote on whether to accept the distribution.
  • If the distribution is accepted, the coins are disbursed and the game ends.
  • If not, the proposer is thrown and dies, and the next most senior pirate makes a new proposal to begin the system again.
  • In case of a tie vote the proposer can has the casting vote

Rules every pirates follows:
  • Every pirate wants to survive
  • Given survival, each pirate wants to maximize the number of gold coins he receives.

What is the maximum number of coins that pirate A might get?

5 , , 100 . , — A, B, C, D, , , — E.

:
  • . ( )
  • , .
  • , .
  • , , , .
  • .


, :
  • .
  • , , .

?


1. Factorielles de grand nombre
Étant donné un entier, la tâche consiste à trouver la factorielle du nombre.

Entrée:
La première ligne d'entrée contient un entier T indiquant le nombre de cas de test.
La première ligne de chaque cas de test est N, le nombre dont la factorielle doit être trouvée

Sortie:
Imprime la factorielle du nombre sur une ligne distincte.

Contraintes: Exemple: entrée sortie
1 ≤ T ≤ 100
1 ≤ N ≤ 1000




3
5
10
2



120
3628800
2

Transfert
, , .

:
T, .
— N, ,

:
.

:
1 ≤ T ≤ 100
1 ≤ N ≤ 1000


:

3
5
10
2


:
120
3628800
2

2. Diamètre de l'arbre binaire
Given a Binary Tree, find diameter of it.
+The diameter of a tree is the number of nodes on the longest path between two leaves in the tree. The diagram below shows two trees each with diameter nine, the leaves that form the ends of a longest path are shaded (note that there is more than one path in each tree of length nine, but no path longer than nine nodes).



Input Format:
First line of input contains the number of test cases T. For each test case, there will be only a single line of input which is a string representing the tree as described below:

1. The values in the string are in the order of level order traversal of the tree where, numbers denotes node values, and a character “N” denotes Enfant NULL .

2. Par exemple:

Pour l'arborescence ci-dessus, la chaîne sera: 1 2 3 NN 4 6 N 5 NN 7 N

Format de sortie:
Pour chaque cas de test, sur une nouvelle ligne, imprimez le diamètre.

Votre tâche:
vous devez compléter la fonction diamètre () qui prend le nœud comme paramètre et renvoie le diamètre.

Contraintes: Exemple: Entrée: Sortie: Explication: Testcase1: L'arbre est Le diamètre est de 3 longueurs. Testcase2: L'arbre est Le diamètre est de 4 longueur.
1 <= T <= 100
1 <= Number of nodes <= 100
1 <= Data of a node <= 100




2
1 2 3
10 20 30 40 60



3
4









Transfert
, .
+ — . , , , , ( , , ).

:
T. , , , :

1. , , “N” .

2. :

: 1 2 3 N N 4 6 N 5 N N 7 N

:
.

:
diameter(), node .

:
1 < = T <= 100
1 < = < = 100
1 < = <= 100


:
:

2
1 2 3
10 20 30 40 60


:
3
4


:
1: :

3.
2: :

4 .

3. Noir et blanc
How many ways are there to place a black and a white knight on an N * M chessboard such that they do not attack each other? The knights have to be placed on different squares. A knight can move two squares horizontally and one square vertically (L shaped), or two squares vertically and one square horizontally (L shaped). The knights attack each other if one can reach the other in one move.

Input:
The first line contains the number of test cases T. Each of the next T lines contains two integers N and M which is size of matrix.

Output:
For each testcase, print the required answer, i.e, number of possible ways to place knights.

Constraints:
1 <= T <= 100
1 <= N, M <= 105


Example:
Input:

3
2 2
2 3
4 5


Output:
12
26
312

Explanation:
Testcase 1:
We can place a black and a white knight in 12 possible ways such that none of them attracts each other.

N * M , ? . (L- ), (L- ). , .

:
T. T N M, .

:
, .

:
1 < = T <= 100
1 <= N, M < = 105


:
:

3
2 2
2 3
4 5


:
12
26
312


:
1:
12 , .



1
. 10 , . . 10, Log2(1000).

, 1 1000 . , . . 1 , 2 . 5, 7 9 , 42 ( 0000101010) .

2
— 98.
1. , A, B C , D E. , (D (100, 0). , E - , 0.
2. , A B , C, D E . D , (C (99, 0, 1), E C).
3. , A . B, C, D E . , B 1 D. (99, 0, 1, 0)
4. A 3, 1 C 1 E, . - (98, 0, 1, 0, 1).
, B , (B , a ). A 2 , B , .

1
:
using namespace boost::multiprecision;
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cpp_int n, res = 1;
        cin >> n;
        while (n != 1)
        {
            res = res * n;
            n = n - 1;
        }
        cout << res << "\n";
    }
    return 0;
}

2
int find(Node* root, int &h)
{
    if (root == NULL) return 0;
    int lh = find(root->left, h);
    int rh = find(root->right, h);
    h = max(h, lh + rh + 1);
    return max(lh, rh) + 1;
}
int diameter(Node* root)
{
    int h = -1;
    find(root, h);
    return h;
}

3
#include <iostream>
#include <cstdint>

typedef unsigned __int128 uint128_t;

/**
 * O(1) solution to https://practice.geeksforgeeks.org/problems/black-and-white/0
 */
int main()
{
    unsigned t;
    uint64_t n, m, upper, lower;
    uint128_t res;
    
    std::cin >> t;
    while (t--)
    {
        std::cin >> n >> m;
        res = n*m; // total ways to choose first knight
        res *= (n*m-1); // now total ways to choose both knights
        if (n>1 && m>1)
            res -= 4*(2*n*m-3*n-3*m+4); // remove any collisions
        
        // the rest is just for printing a uint128_t
        upper = (uint64_t)(res/1000000000000000000);
        lower = (uint64_t)(res%1000000000000000000);
        if (upper)
        {
            std::cout << upper;
            uint64_t digitChecker = 100000000000000000;
            while (lower/digitChecker == 0 && digitChecker)
            {
                std::cout << 0;
                digitChecker /= 10;
            }
        }
        std::cout << lower << std::endl;
    }
    
	return 0;
}

All Articles