Megoldások - 2019. simulare

II.2

1
2
3
4
5
6
7
struct eveniment {
    int id;
    struct {
        int zi;
        int luna;
    } data;
} e;

III.1

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
#include <iostream>
using namespace std;

// n=7255     75 23 50 5
//             7 52  35  05

void inserare(int &n)
{
    int eredmeny = 0;
    int p = 1;

    eredmeny += (n%10) * p;
    p *= 10;
    int elozo = n%10;
    n = n / 10;

    while (n > 0) {
        int akt = n%10;

        int kul = akt-elozo;
        if (kul < 0)
            kul = -kul;

        eredmeny += kul * p;
        p *= 10;

        eredmeny += akt * p;
        p *= 10;

        elozo = akt;
        n = n / 10;
    }

    n = eredmeny;
}

//VAGY

void inserare2(int &n)
{
    int eredmeny = 0;
    int p = 1;

    while (n >= 10) {
        int akt = n % 10;
        int masik = n / 10 % 10;

        eredmeny += akt * p;
        p *= 10;

        int kul = akt-masik;
        if (kul < 0)
            kul = -kul;

        eredmeny += kul * p;
        p *= 10;

        n = n / 10;
    }

    eredmeny += n * p;
    n = eredmeny;
}

//VAGY

void inserare3(int &n)
{
    int index = 0;
    int t[20];

    while (n > 0) {
        t[index] = n%10;
        index++;

        n = n / 10;
    }

    // t[0] ... t[index-1]

    for (int i = 1; i < index; i += 2) {
        // t[i-1] és t[i] közé beszúrunk

        for (int j = index-1; j >= i; j--)
            t[j+1] = t[j];
        index++;

        t[i] = t[i-1] - t[i+1];
        if (t[i] < 0)
            t[i] = -t[i];
    }

    int eredmeny = 0;
    for (int j = index-1; j >= 0; j--)
        eredmeny = eredmeny * 10 + t[j];

    n = eredmeny;
}

int main()
{
    int x = 7255;
    inserare(x);
    cout << x << endl;

    return 0;
}

III.2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[51];
    cin.getline(s, 51);

    char eredmeny[200] = "";

    char *p = strtok(s, " ");
    while (p != NULL) {

        if (p[strlen(p)-1] == '.') {
            if (p[0] == 'C') strcat(eredmeny, "COLEGIUL");
            else if (p[0] == 'L') strcat(eredmeny, "LICEUL");
            else if (p[0] == 'N') strcat(eredmeny, "NATIONAL");
            else if (p[0] == 'T') strcat(eredmeny, "TEORETIC");
        }
        else {
            strcat(eredmeny, p);
        }

        strcat(eredmeny, " ");

        p = strtok(NULL, " ");
    }

    eredmeny[strlen(eredmeny)-1] = '\0';
    cout << eredmeny << endl;
    return 0;
}

III.3

Hatékony változat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;

int main()
{
    ifstream fin("bac.txt");

    int n;
    fin >> n;

    int max_paros_bal = INT_MIN;
    int max_paratlan_bal = INT_MIN;

    int min_paros_jobb = INT_MAX;
    int min_paratlan_jobb = INT_MAX;

    for (int i = 0; i < n; i++) {
        int szam;
        fin >> szam;

        if (szam % 2 == 0 && szam > max_paros_bal)
            max_paros_bal = szam;
        else if (szam % 2 != 0 && szam > max_paratlan_bal)
            max_paratlan_bal = szam;
    }

    for (int i = 0; i < n; i++) {
        int szam;
        fin >> szam;

        if (szam % 2 == 0 && szam < min_paros_jobb)
            min_paros_jobb = szam;
        else if (szam % 2 != 0 && szam < min_paratlan_jobb)
            min_paratlan_jobb = szam;
    }

    if (max_paros_bal < min_paratlan_jobb
        && max_paratlan_bal < min_paros_jobb)
    {
        cout << "DA" << endl;
    }
    else
        cout << "NU" << endl;

    return 0;
}

Fogalmazás hozzá:

A program beolvassa a sorozat első n darab elemét, megjegyzi a legnagyobb páros és a legnagyobb páratlan értéket innen. Aztán beolvassa a következő n elemet és megjegyzi a legkisebb páros és a legkisebb páratlan értéket azok közül.

A sorozat paritar típusú ha a bal oldali párosak maximuma kisebb a jobb oldali páratlanok minimumánál, illetve a bal oldali páratlanok maximuma kisebb a jobb oldali párosak minimumánál (mert ekkor bármely két elemükre teljesül a kért feltétel).

A program idő szempontjából hatékony, mert csak egyszer halad végig a sorozat elemein, minden elemre konstans számú lépést végez.

Memória szempontjából azért hatékony, mert nem tárolja a sorozat elemeit egyszerre, csak konstans mennyiségű memóriát használ.

Kevésbé hatékony változat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;

int t[2000000];

int main()
{
    ifstream fin("bac.txt");

    int n;
    fin >> n;

    for (int i = 0; i < 2*n; i++)
        fin >> t[i];

    bool ok = true;

    for (int i = 0; i < n; i++) {
        for (int j = n; j < 2*n; j++) {
            if (t[i] % 2 != t[j] % 2 && t[i] >= t[j])
                ok = false;
        }
    }

    if (ok)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;

    return 0;
}