5099
У футбольному турнірі ЛКС Микита, вчитель фізкультури, має підсумувати результати та скласти підсумкову турнірну таблицю. Турнір проходив за круговою системою, тобто кожна команда зіграла з кожною іншою рівно один раз. За перемогу команда отримувала очки, за нічию — очко, а за поразку — очок. У підсумковій таблиці також враховується різниця м'ячів, тобто різниця між забитими та пропущеними голами.
Команди слід ранжувати у спадаючому порядку за кількістю очок. Якщо дві чи більше команд мають однакову кількість очок, вище розташовується команда з більшою різницею м'ячів.
Вхідні дані
У першому рядку дано одне ціле число () — кількість команд у турнірі. У другому рядку записані невід’ємних цілих чисел — кількість очок, набрана кожною командою. У третьому рядку записані цілих чисел — різниця м'ячів для кожної команди.
Вихідні дані
Виведіть цілих чисел — номери команд у тому порядку, у якому вони повинні бути в підсумковій турнірній таблиці. Якщо команди мають однакову кількість очок і різницю м'ячів, вони повинні зберігати свій початковий порядок з вхідних даних.
Приклади
Кожна команда характеризується трьома параметрами:
-
Індекс (номер команди, щоб відновити початковий порядок)
-
Кількість очок
-
Різниця м’ячів
Потрібно сортувати команди за спаданням очок, потім за спаданням різниці м’ячів.
#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;
}
Вхідні дані
На площині задано два прямокутники. Кожен прямокутник заданий координатами кінців однієї зі своїх діагоналей. Сторони прямокутників паралельні осям координат.
В першому рядку дано чотири дійсних числа: , , , — координати кінців діагоналі першого прямокутника.
У другому рядку дано чотири дійсних числа: , , , — координати кінців діагоналі другого прямокутника.
Всі координати — дійсні числа, що за модулем не перевищують .
Вихідні дані
Виведіть єдине число — площу перетину двох прямокутників, округлену до трьох знаків після коми.
Приклади
Кожен прямокутник задається координатами кінців однієї діагоналі
(x1, y1)і(x2, y2).-
Знаходимо координати лівого нижнього і правого верхнього кутів:
-
Перетин двох прямокутників також є прямокутником (можливо нульовим):
-
Площа перетину:
#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";
}
Комментариев нет:
Отправить комментарий