Przykładowe rozwiązania zadań z kolokwium

Objętości pudełek

Zadanie

Zadaniem programu jest obliczenie sumy objętości podanych prostopadłościennych pudełek i wyświetlenie obliczonej sumy.

Wejście

Pierwszą liczbą wejścia T (1 ≤ T ≤ 100) jest liczba zestawów testowych. Każdy zestaw testowy zawiera najpierw liczbę trójek N (1 ≤ N ≤ 100), a następnie N trójek liczb rzeczywistych a, b, c o co najwyżej dwóch miejscach po przecinku (0 < a, b, c ≤ 1000.00), będących długościami boków kolejnych pudełek.

Wyjście

Dla każdego zestawu testowego należy wypisać na wyjściu w osobnej linii sumę objętości podanych pudełek z dokładnie sześcioma miejscami po przecinku.

Przykład

Wejście

2
1
1 1 1.05
3
14 2 7
1 14 5
3 2 3

Wyjście

1.050000
284.000000
#include <iostream>
#include <iomanip>

using namespace std;

void test() {
    int n;
    cin >> n;
    double suma = 0.0;
    while(n--) {
        double a, b, c;
        cin >> a >> b >> c;
        suma += a*b*c;
    }
    cout << suma << '\n';
}

int main() {
    cin.sync_with_stdio(false);
    int t;
    cin >> t;
    cout << fixed << setprecision(6);
    while(t--) {
        test();
    }
    return 0;
}

Pola trójkątów

Zadanie

Zadaniem programu jest obliczenie sumy pól podanych trójkątów prostokątnych i wyświetlenie obliczonej sumy.

Wejście

Pierwszą liczbą wejścia T (1 ≤ T ≤ 100) jest liczba zestawów testowych. Każdy zestaw testowy zawiera najpierw liczbę par N (1 ≤ N ≤ 100), a następnie N par liczb rzeczywistych a, b o co najwyżej dwóch miejscach po przecinku (0 < a, b ≤ 1000.00), będących długościami przyprostokątnych kolejnych trójkątów.

Wyjście

Dla każdego zestawu testowego należy wypisać na wyjściu w osobnej linii sumę pól podanych trójkątów z dokładnie pięcioma miejscami po przecinku.

Przykład 1

Wejście

2
2
1.01 1.99
7.08 2.03
3
14 2
1 14
3 2

Wyjście

8.19115
24.00000
#include <iostream>
#include <iomanip>

using namespace std;

void test() {
    int n;
    cin >> n;
    double suma = 0.0;
    while(n--) {
        double a, b;
        cin >> a >> b;
        suma += a*b/2;
    }
    cout << suma << '\n';
}

int main() {
    cin.sync_with_stdio(false);
    int t;
    cin >> t;
    cout << fixed << setprecision(5);
    while(t--) {
        test();
    }
    return 0;
}

Długość słów

Zadanie

Zadaniem programu jest wypisanie długości napotkanych w tekście słów. Program ma pomijać znaki interpunkcyjne.

Wejście

Pierwszą liczbą wejścia T (1 ≤ T ≤ 100 ) jest liczba następujących po niej wierszy tekstu. Każda linijka tekstu zawiera W (1 ≤ W ≤ 1000) wyrazów z których każde składa się z L (1≤ L≤ 20) liter. Słowa składają się z liter alfabetu łacińskiego, zarówno wielkich jak i małych (czyli a-z i A-Z). Wielkie litery mogą występować także w środku wyrazu. Oprócz tego w tekście występują spacje i inne znaki interpunkcyjne. Znaki interpunkcyjne występują tylko na końcach wyrazów, a spacje – jak to spacje – pomiędzy wyrazami.

Wyjście

Dla każdej linijki tekstu należy wypisać linijkę zawierającą pooddzielane spacjami długości kolejno napotkanych słów. Oczywiście znak interpunkcyjny nie wlicza się do długości wyrazu (patrz przykład poniżej). Na końcu każdej linijki należy wpisać słowo ENTER.

Przykład

Wejście

7
Arma virumque cano, Troiae qui primus ab oris
Italiam, fato profugus, Laviniaque venit
litora, multum ille et terris iactatus et alto
vi superum saevae memorem Iunonis ob iram;
multa quoque et bello passus, dum conderet urbem,
inferretque deos Latio, genus unde Latinum,
Albanique patres, atque altae moenia Romae.

Wyjście

4 8 4 6 3 6 2 4 ENTER
7 4 8 10 5 ENTER
6 6 4 2 6 8 2 4 ENTER
2 7 6 7 7 2 4 ENTER
5 6 2 5 6 3 8 5 ENTER
11 4 5 5 4 7 ENTER
9 6 5 5 6 5 ENTER
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void test() {
    string line;
    getline(cin, line);
    int l = 0;
    for (string::iterator i = line.begin(); i != line.end(); ++i) {
        if (('A' <= *i && *i <= 'Z') || ('a' <= *i && *i <= 'z')) {
            l++;
        } else {
            if (l > 0) {
                cout << l << " ";
            }
            l = 0;
        }
    }
    if (l > 0) {
        cout << l << " ";
    }
    cout << "ENTER\n";
}

int main() {
    int t;
    cin >> t;
    cin.ignore(10, '\n');
    while(t--) {
        test();
    }
    return 0;
}

Kolejne liczby

Zadanie

Zadaniem programu jest sprawdzenie, czy podany na wejściu zbiór liczb jest zbiorem liczb kolejnych.

Opis wejścia

Pierwszą liczbą wejścia T (1 ≤ T ≤ 10 ) jest liczba zestawów testowych. Każdy zestaw testowy zawiera najpierw długość ciągu liczb do przetestowania N (1 ≤ N ≤ 10000), a w następnej linijce N liczb całkowitych z przedziału [-10000, 10000] (niekoniecznie różnych).

Opis wyjścia

Dla każdego zestawu testowego należy wypisać na wyjściu w osobnej linii TAK lub NIE w zależności od tego czy podane liczby tworzą zbiór kolejnych liczb (np. liczby „1, 3, 2, 1”, tworzą zbiór {1, 2, 3} składający się z kolejnych liczb).

Przykład

Wejście

2
9
-1 3 5 5 3 1 0 2 4
3
4 1 2

Wyjście

TAK
NIE
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void test() {
    int n;
    cin >> n;
    vector<int> v;
    while(n--) {
        int x;
        cin >> x;
        v.push_back(x);
    }
    sort(v.begin(), v.end());
    for (vector<int>::iterator i = v.begin(); i != (v.end()-1); ++i) {
        if ((*(i+1) - *i) > 1) {
            cout << "NIE\n";
            return;
        }
    }
    cout << "TAK\n";
}

int main() {
    cin.sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--) {
        test();
    }
    return 0;
}

Ciągi wektorów

Zadanie

Zadaniem programu jest sprawdzenie czy dwa ciągi wektorów zawierają identyczny wektor (identyczny oznacza: o dokładnie tym samym początku i końcu, nie tylko tej samej długości czy zwrocie – wektory nie są swobodne).

Wejście

Pierwszą liczbą wejścia jest T (1 ≤ T ≤ 30) oznaczająca liczbę testów. Każdy test zawiera dwa ciągi wektorów. Każdy ciąg opisany jest następująco: najpierw liczba punktów N (2 ≤ N ≤ 100), a następnie lista N punktów X (-100 ≤ X ≤ 100) opisujących kolejne wektory. Pierwszy wektor łączy pierwsze dwa podane punkty, drugi wektor łączy punkt drugi i trzeci itd. Tym samym każdy punkt, poza pierwszym i ostatnim, jest końcem jednego wektora i początkiem następnego. Dla przykładu ciąg punktów „0 2 1” koduje dwa wektory: wektor 0 → 2 oraz wektor 2 → 1. Jak widać ciąg punktów niekoniecznie musi być rosnący.

Wyjście

Dla każdej pary ciągów wektorów należy wypisać w osobnej linii TAK, gdy zawierają identyczny wektor lub NIE, jeśli go nie zawierają.

Przykład

Wejście

2
4
2 3 0 1
4
0 1 2 2
3
2 -1 3
4
0 -3 1 2

Wyjście

TAK
NIE
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool compareVectors(int x1, int y1, int x2, int y2) {
    if (x1 == x2 && y1 == y2) {
        return true;
    } else {
        return false;
    }
}

void readVector(vector<int> &v) {
    int n;
    cin >> n;
    while(n--) {
        int t;
        cin >> t;
        v.push_back(t);
    }
}

void test() {
    vector<int> X;
    vector<int> Y;
    readVector(X);
    readVector(Y);
    for(vector<int>::iterator i = X.begin()+1; i != X.end(); ++i) {
        for(vector<int>::iterator j = Y.begin()+1; j != Y.end(); ++j) {
            if (compareVectors(*(i-1), *i, *(j-1), *j)) {
                cout << "TAK\n";
                return;
            }
        }
    }
    cout << "NIE\n";
}

int main() {
    cin.sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        test();
    }
    return 0;
}

Łamanie tekstu

Zadanie

Zadaniem programu jest symulacja prostego algorytmu dzielenia tekstu na kolejne linie. Zakładamy, że inny program już policzył liczbę liter w każdym wyrazie, więc na wejściu dostajemy ciąg liczb. Nasz program musi tylko powstawiać znaki końca linii, tak aby tekst mieścił się w linijce o zadanej długości. Zakładamy, że algorytm łamie linię dopiero wtedy gdy musi – gdy następny wyraz nie mieści się już w linii. Jeżeli w jakimś miejscu nie da się zmieścić tekstu w linii bez dzielenia wyrazów, należy odpowiednio to zaznaczyć (patrz opis wyjścia). Zakładamy, że spacja ma szerokość jednej litery.

Wejście

Pierwszą liczbą wejścia jest T (1 ≤ T ≤ 100) oznaczające pożądaną długość linii. Drugą liczbą wejścia W (1 ≤ W ≤ 10000) jest liczba słów, które były w oryginalnym tekście. Następnie na wejściu jest lista W liczb naturalnych N (1 ≤ N ≤ 30) oznaczających długości poszczególnych słów.

Wyjście

Program powinien wypisać w kolejności otrzymaną listę długości słów, wstawiając we właściwe miejsce podziału linii w tekście słowo ENTER i znak nowej linii. Jeżeli bez dzielenia wyrazów nie da się zmieścić tekstu w linii, należy zamiast ENTER napisać OVERFULL (co ma oznaczać, że tekst wystaje na prawy margines) i rozpocząć następną linię. Na końcu ostatniej linii należy również wypisać ENTER bądź OVERFULL.

Przykład

Wejście

10
15
4 4 1 6 14 12 7 6 3 2 1 17 9 4 2

Wyjście

4 4 ENTER
1 6 ENTER
14 OVERFULL
12 OVERFULL
7 ENTER
6 3 ENTER
2 1 ENTER
17 OVERFULL
9 ENTER
4 2 ENTER
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    cin.sync_with_stdio(false);
    int lineLength;
    cin >> lineLength;
    int n;
    cin >> n;
    int line = 0;
    while(n--) {
        int word;
        cin >> word;
        if (line == 0) {
            line += word;
        } else {
            line += word + 1;
        }
        if (line <= lineLength) {
            cout << word << " ";
        } else if (word <= lineLength) {
            cout << "ENTER\n";
            line = word;
            cout << word << " ";
        } else if (line == word) {
            cout << word << " OVERFULL\n";
            line = 0;
        } else {
            cout << "ENTER\n" << word << " OVERFULL\n";
            line = 0;
        }
    }
    if (line > 0) {
        cout << "ENTER\n";
    }
    return 0;
}