среда, 3 декабря 2025 г.

 5099

У футбольному турнірі ЛКС Микита, вчитель фізкультури, має підсумувати результати та скласти підсумкову турнірну таблицю. Турнір проходив за круговою системою, тобто кожна команда зіграла з кожною іншою рівно один раз. За перемогу команда отримувала  очки, за нічию —  очко, а за поразку —  очок. У підсумковій таблиці також враховується різниця м'ячів, тобто різниця між забитими та пропущеними голами.

Команди слід ранжувати у спадаючому порядку за кількістю очок. Якщо дві чи більше команд мають однакову кількість очок, вище розташовується команда з більшою різницею м'ячів.

Вхідні дані

У першому рядку дано одне ціле число  () — кількість команд у турнірі. У другому рядку записані  невід’ємних цілих чисел — кількість очок, набрана кожною командою. У третьому рядку записані  цілих чисел — різниця м'ячів для кожної команди.

Вихідні дані

Виведіть  цілих чисел — номери команд у тому порядку, у якому вони повинні бути в підсумковій турнірній таблиці. Якщо команди мають однакову кількість очок і різницю м'ячів, вони повинні зберігати свій початковий порядок з вхідних даних.

Приклади

Вхідні дані #1
3
1 2 3
3 2 1
Відповідь #1
3 2 1
  • Кожна команда характеризується трьома параметрами:

    1. Індекс (номер команди, щоб відновити початковий порядок)

    2. Кількість очок

    3. Різниця м’ячів

  • Потрібно сортувати команди за спаданням очок, потім за спаданням різниці м’ячів.

  • #include <bits/stdc++.h>

    using namespace std;

    struct Team {

        int index;

        int points;

        int goalDiff;

    };

    int main() {

        ios::sync_with_stdio(false);

        cin.tie(nullptr);

        int N;

        cin >> N;

        vector<Team> teams(N);

        for (int i = 0; i < N; i++) {

            teams[i].index = i + 1; // нумерація команд з 1

        }

        for (int i = 0; i < N; i++) {

            cin >> teams[i].points;

        }

        for (int i = 0; i < N; i++) {

            cin >> teams[i].goalDiff;

        }

        stable_sort(teams.begin(), teams.end(), [](const Team &a, const Team &b) {

            if (a.points != b.points)

                return a.points > b.points; // більше очок спереду

            return a.goalDiff > b.goalDiff; // при рівних очках більша різниця м'ячів спереду

        });

        for (int i = 0; i < N; i++) {

            cout << teams[i].index << " ";

        }

        cout << "\n";

        return 0;

    }

    153

    Вхідні дані

    На площині задано два прямокутники. Кожен прямокутник заданий координатами кінців однієї зі своїх діагоналей. Сторони прямокутників паралельні осям координат.

    В першому рядку дано чотири дійсних числа:  — координати кінців діагоналі першого прямокутника.

    У другому рядку дано чотири дійсних числа:  — координати кінців діагоналі другого прямокутника.

    Всі координати — дійсні числа, що за модулем не перевищують .

    Вихідні дані

    Виведіть єдине число — площу перетину двох прямокутників, округлену до трьох знаків після коми.

    Приклади

    Вхідні дані #1
    1 1 5 5
    2 2 3 3
    
    Відповідь #1
    1.000

    • Кожен прямокутник задається координатами кінців однієї діагоналі (x1, y1) і (x2, y2).

    • Знаходимо координати лівого нижнього і правого верхнього кутів:

    xmin=min(x1,x2),xmax=max(x1,x2)x_{\min} = \min(x1, x2),\quad x_{\max} = \max(x1, x2) ymin=min(y1,y2),ymax=max(y1,y2)y_{\min} = \min(y1, y2),\quad y_{\max} = \max(y1, y2)
    • Перетин двох прямокутників також є прямокутником (можливо нульовим):

    xleft=max(x1min,x2min)x_{\text{left}} = \max(x1_{\text{min}}, x2_{\text{min}}) xright=min(x1max,x2max)x_{\text{right}} = \min(x1_{\text{max}}, x2_{\text{max}}) ybottom=max(y1min,y2min)y_{\text{bottom}} = \max(y1_{\text{min}}, y2_{\text{min}}) ytop=min(y1max,y2max)y_{\text{top}} = \min(y1_{\text{max}}, y2_{\text{max}})
    • Площа перетину:

    area=max(0.0,xrightxleft)max(0.0,ytopybottom)\text{area} = \max(0.0, x_{\text{right}} - x_{\text{left}}) \cdot \max(0.0, y_{\text{top}} - y_{\text{bottom}})


    #include <bits/stdc++.h>

    using namespace std;

    int main() {

        ios::sync_with_stdio(false);

        cin.tie(nullptr);


        double x1, y1, x2, y2;

        double x3, y3, x4, y4;

        cin >> x1 >> y1 >> x2 >> y2;

        cin >> x3 >> y3 >> x4 >> y4;

        double x1_min = min(x1, x2), x1_max = max(x1, x2);

        double y1_min = min(y1, y2), y1_max = max(y1, y2);

        double x2_min = min(x3, x4), x2_max = max(x3, x4);

        double y2_min = min(y3, y4), y2_max = max(y3, y4);

        double x_left = max(x1_min, x2_min);

        double x_right = min(x1_max, x2_max);

        double y_bottom = max(y1_min, y2_min);

        double y_top = min(y1_max, y2_max);

        double area = max(0.0, x_right - x_left) * max(0.0, y_top - y_bottom);

        cout << fixed << setprecision(3) << area << "\n";


    }



     1962 

    Під час Олімпіади кожен учасник отримав унікальний ідентифікаційний номер, який є додатним цілим числом. Потрібно відсортувати список учасників за кількістю набраних ними балів.

    Вхідні дані

    У першому рядку задано число  () — кількість учасників. Кожен із наступних  рядків містить ідентифікаційний номер та кількість набраних балів відповідного учасника. Усі числа у вхідних даних не перевищують .

    Вихідні дані

    Виведіть учасників у порядку спадання балів. Якщо декілька учасників мають однакову кількість балів, впорядкуйте їх за зростанням ідентифікаційного номера.

    Потрібно відсортувати список учасників:

    • спочатку за балами (спадання),

    • при однакових балах — за ID (зростання).

    #include <iostream>
    using namespace std;
    int a[10000],b[10000],i,q;
    int main()
    {
     int n;
     cin>>n;
     for(int i=0; i<n; i++)
     cin>>a[i]>>b[i];
     for(int j=0; j<n-1; j++)
     for(int i=0; i<n-1; i++)
     if(b[i]<b[i+1] || b[i]==b[i+1] && a[i]>a[i+1])
     {
     q =a[i];
     a[i]=a[i+1];
     a[i+1]=q;
     q=b[i];
     b[i]=b[i+1];
     b[i+1]=q; 
     }
     for(int i=0; i<n; i++)
     cout<<a[i]<<' '<<b[i]<<endl;
    return 0
    }
  • Зчитуємо N.

  • Зберігаємо пари (ID, score).

  • Сортуємо з власним компаратором:

    • x.second > y.second – більші бали йдуть раніше.

    • якщо бали рівні — x.first < y.first.

  • Виводимо відсортований список.

  • #include <bits/stdc++.h>

  • using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int N;
        cin >> N;
    
        vector<pair<int, int>> a(N); 
        // first = ID, second = score
    
        for (int i = 0; i < N; i++) {
            cin >> a[i].first >> a[i].second;
        }
    
        sort(a.begin(), a.end(), [](const auto &x, const auto &y) {
            if (x.second != y.second)
                return x.second > y.second;   // за балами спадання
            return x.first < y.first;         // за ID зростання
        });
    
        for (auto &p : a) {
            cout << p.first << " " << p.second << "\n";
        }
    
        return 0;
    }
    
    57 

    Школярі, прямують зі школи додому або навпаки, полюбляють ласувати цукерками. Але, як це часто буває, приємна звичка іноді призводить до неприємних наслідків — діти часто викидають обгортки від цукерок у шкільному дворі.

    butterfly

    Мурзик завжди стежив за чистотою у шкільному дворі, а метелики, вдячні за прекрасні фотографії, які робив Мурзик, із задоволенням йому допомагали. Метелики могли використовувати свої крила як лінзи, змінюючи їхню фокусну відстань на власний розсуд. Коли метелик знаходив обгортку від цукерки у точці з координатами  на шкільному подвір’ї, він відлітав у точку з координатами  — за шляхом сонячного променя, що потрапляв на обгортку — налаштовував фокусну відстань своїх крильце-лінз і підпалював обгортку.

    Якою була оптична сила  крильце-лінз метелика в цей момент?

    Вхідні дані

    У першому рядку містяться два цілих числа: координати  обгортки від цукерки.

    У другому рядку містяться три цілих числа: координати  метелика у момент підпалу обгортки.

    Всі вхідні числа — цілі, по модулю не перевищують .

    Вихідні дані

    Виведіть одне число — оптичну силу  крильце-лінз, округлену математично до трьох знаків після коми.

    Приклади

    Вхідні дані #1
    10 20
    10 20 100
    
    Відповідь #1
    0.010
    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
     
    int main() {
        double x1, y1, z1, x, y, S;
        cin >> x >> y;
        cin >> x1 >> y1 >> z1;
        S = sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y) + z1*z1);
        cout << fixed << setprecision(3) << 1/S;
        return 0;
    }
    2045

    Дано чотири відрізки за координатами їхніх кінців:  і  і  і  і . Визначте, чи ці відрізки утворюють прямокутник. Якщо так, обчисліть його площу.

    Вхідні дані

    Вхідні дані складаються з чотирьох рядків. У кожному рядку записано через пробіл координати  та  кінців одного відрізка. Усі координати — цілі числа за модулем не більші за .

    Вихідні дані

    Якщо відрізки утворюють прямокутник, виведіть у першому рядку YES, а в другому — площу прямокутника, округлену до двох знаків після коми. Якщо зазначені відрізки не утворюють прямокутника, виведіть лише один рядок з NO.

    Приклади

    Вхідні дані #1
    1 1 1 2
    4 1 1 1
    4 2 4 1
    4 2 1 2
    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        vector<pair<ll,ll>> segA(4), segB(4);
        for (int i = 0; i < 4; ++i) {
            if (!(cin >> segA[i].first >> segA[i].second >> segB[i].first >> segB[i].second)) {
                return 0; // неочікуваний кінець вводу
            }
        }
    
        // Зберемо всі кінці
        vector<pair<ll,ll>> ends;
        for (int i = 0; i < 4; ++i) {
            ends.push_back(segA[i]);
            ends.push_back(segB[i]);
        }
    
        // Унікальні точки — індексуємо їх
        map<pair<ll,ll>, int> idx;
        vector<pair<ll,ll>> pts;
        for (auto &p : ends) {
            if (!idx.count(p)) {
                int id = (int)pts.size();
                idx[p] = id;
                pts.push_back(p);
            }
        }
    
        if (pts.size() != 4) {
            cout << "NO\n";
            return 0;
        }
    
        // Строимо граф (ребро між кінцями кожного відрізка)
        vector<vector<int>> adj(4);
        vector<int> deg(4,0);
        for (int i = 0; i < 4; ++i) {
            int u = idx[segA[i]];
            int v = idx[segB[i]];
            // Якщо отримаємо петлю — не підходить
            if (u == v) {
                cout << "NO\n";
                return 0;
            }
            adj[u].push_back(v);
            adj[v].push_back(u);
            deg[u]++; deg[v]++;
        }
    
        // Кожна вершина має ступінь 2
        for (int i = 0; i < 4; ++i) {
            if (deg[i] != 2) {
                cout << "NO\n";
                return 0;
            }
        }
    
        // Перевіримо прямі кути в кожній вершині
        auto dot = [](const pair<ll,ll>& a, const pair<ll,ll>& b) -> ll {
            return a.first*b.first + a.second*b.second;
        };
        auto vec = [&](int from, int to) {
            return make_pair(pts[to].first - pts[from].first, pts[to].second - pts[from].second);
        };
        for (int i = 0; i < 4; ++i) {
            int a = adj[i][0], b = adj[i][1];
            auto v1 = vec(i, a);
            auto v2 = vec(i, b);
            // вектори не повинні бути нульовими
            if ((v1.first == 0 && v1.second == 0) || (v2.first == 0 && v2.second == 0)) {
                cout << "NO\n";
                return 0;
            }
            if (dot(v1, v2) != 0) { // не перпендикулярні
                cout << "NO\n";
                return 0;
            }
        }
    
        // Якщо всі кути прямі — це прямокутник. Обчислимо площу:
        // Візьмемо будь-яку вершину i і дві прилеглі сторони
        int i = 0;
        auto v1 = vec(i, adj[i][0]);
        auto v2 = vec(i, adj[i][1]);
        // довжини сторін
        double l1 = sqrt((double)v1.first*v1.first + (double)v1.second*v1.second);
        double l2 = sqrt((double)v2.first*v2.first + (double)v2.second*v2.second);
        double area = l1 * l2;
    
        cout << "YES\n";
        cout.setf(ios::fixed); cout<<setprecision(2)<<area<<"\n";
        return 0;
    }
    
    9626

    Задано три рядки символів. Перевірте, чи є другий рядок префіксом першого, а також чи є третій рядок суфіксом першого.

    Вхідні дані

    Три рядки, кожен з яких містить не більше 100 символів.

    Вихідні дані

    У першому рядку виведіть true або false в залежності від того, чи є другий рядок префіксом першого. У другому рядку виведіть true або false в залежності від того, чи є третій рядок суфіксом першого.

    Приклади

    Вхідні дані #1
    qwerty
    qwe
    ty
    Відповідь #1
    true
    true
    
    Вхідні дані #2
    asdfghj
    as
    uj
    #include <iostream>
    #include <string>
    
    int main() {
        std::string a, b, c;
        std::getline(std::cin, a);
        std::getline(std::cin, b);
        std::getline(std::cin, c);
    
        // перевірка префікса
        bool isPrefix = a.substr(0, b.size()) == b;
    
        // перевірка суфікса
        bool isSuffix = a.size() >= c.size() && a.substr(a.size() - c.size()) == c;
    
        std::cout << (isPrefix ? "true" : "false") << '\n';
        std::cout << (isSuffix ? "true" : "false") << '\n';
    }