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

 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';
    }




    Комментариев нет:

    Отправить комментарий