Megoldások - 2025. júl.

I.2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void f(int n)
{
    int i;
    for(i=1;i<=n;i++)
        if(i%2==0){
            cout<<i;
            f(i-1);
        }
        else {
            f(i-1);
            cout<<i;
        }
}

Mennyi f(3) értéke?

    f(3)
    |   i=1
    |   f(0)
    |   |
    |   []
    |   cout << 1
    |   i=2
    |   cout << 2
    |   f(1)
    |   |   i=1
    |   |   f(0)
    |   |   |
    |   |   []
    |   |   cout << 1
    |   []
    |   i=3
    |   f(2)
    |   |   i=1
    |   |   f(0)
    |   |   |
    |   |   []
    |   |   cout << 1
    |   |   i=2
    |   |   cout << 2
    |   |   f(1)
    |   |   |   i=1
    |   |   |   f(0)
    |   |   |   |
    |   |   |   []
    |   |   |   cout << 1
    |   |   []
    |   []
    |   cout << 3
    []

Kimenet: 1211213

II.1.c

 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
#include <iostream>
using namespace std;

int main()
{
    int m, n, nr, i;
    cin >> m >> n;
    nr = 0;
    i = m;

    do {
        int x = 1;
        while (x*x < i) {
            x = x + 1;
        }
        if (x*x == i)
            nr = i;
        else
            i = i+1;

    } while (!(i > n || nr != 0));

    cout << nr << endl;
    return 0;
}

II.1.d

    ...
    amíg x*x<i v.e.
    |   x <- x+1
    []
    ...

Átírva:

    ...
    ha x*x < i akkor
    |   v.e.
    |   |    x <- x+1
    |   |amíg x*x<i
    |   []
    []
    ...

Vagy:

    ...
    ha x*x < i akkor
    |   ismételd
    |   |    x <- x+1
    |   |ameddig x*x>=i
    |   []
    []
    ...

II.3.

1
2
3
4
5
6
struct prajitura
{
    int cod;
    double pret;
    int informatii[3];
} p;

III.1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
int ascendent(int n, int x, int y)
{
   int s = 0;

   for(int i=x; i<=y; i++){
        int a=i;
        bool jo = true;
        do{
            if(a%10<n%10){
                jo = false;
            }
            a=a/10;
        }while(a>0 && jo);
        if(jo) s+=i;
   }

   return s;
}

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
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
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char str[202];
    cin.getline(str, 202);

    char eredmeny[202] = "";

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

        int n = strlen(p);

        if (n % 2 != 0) {
            strcat(eredmeny, p);
        }
        else {
            /*
            strcat(eredmeny, p + n/2);
            p[n/2] = '\0';
            strcat(eredmeny, p);
            */
            
            /* VAGY:
            char uj[202];
            int c = 0;

            for (int i = n/2; i < n; i++) {
                uj[c] = p[i];
                c++;
            }
            for (int i = 0; i < n/2; i++) {
                uj[c] = p[i];
                c++;
            }
            uj[c] = '\0';

            strcat(eredmeny, uj);
            */

            // VAGY:
            for (int i = 0; i < n/2; i++) {
                // p[i] <-> p[i+n/2]
                char seged = p[i];
                p[i] = p[i+n/2];
                p[i+n/2] = seged;
            }

            strcat(eredmeny, p);
        }

        strcat(eredmeny, " ");
        p = strtok(NULL, " ");
    }

    eredmeny[strlen(eredmeny)-1] = '\0';
        // levagja a " "-t

    strcpy(str, eredmeny);
    cout << str << endl;

    return 0;
}

III.3.a

Az algoritmus beolvassa az első intervallumot ([a,b]) majd a többi ([x,y]) intervallum mindegyikét beolvasás közben teszteli. Amennyiben van legalább 1 egység hosszú metszete az első intervallummal (…feltétel…), akkor számoljuk és megjegyezzük az utolsó ilyen pozícióját (beolvasás közben követtük a pozíciókat).

Az algoritmus hatékony idő szempontjából, mert egyszer halad végig az intervallumok sorozatán és mindegyikre konstans számú műveletet végez.

Memória szempontjából azért hatékony, mert konstans mennyiségű változót használ, nem menti le az összes intervallumot.

III.3.b HF

 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>
using namespace std;

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

    int a, b;
    fin >> a >> b;

    int poz = 0;
    int x, y;

    int hany_jo = 0;
    int utolso_poz = -1;


    while (fin >> x >> y)
    {
        ++poz;


        if (!(y <= a || x >= b)) {
            hany_jo++;
            utolso_poz = poz;
        }
    }

    cout << hany_jo << " " << utolso_poz << endl;

    return 0;
}