
B. Гости Вася переехал из своего родного города и очень скучает по старым друзьям. К сожалению,
Вася снимает маленькую квартиру и одновременно в гости к нему может приехать только один друг. Каждый друг сказал Васе два числа A и B - с какого по какой день он может приехать в гости. Каждый друг приезжает и уезжает в полдень. Каждый друг может приехать к Васе только один раз и остаться у него на несколько дней. Вася хотел бы, чтобы суммарное количество дней, когда у него в гостях есть кто-нибудь из друзей, было максимальным. Помогите ему определить даты приезда для каждого из друзей так, чтобы они не пересекались (допустима ситуация, что в один день один из друзей приезжает, а другой - уезжает) и суммарное время, когда у Васи в гостях есть кто-то из друзей, было максимальным. Формат ввода В первой строке записаны целое число N (1 ≤ N ≤ 100000) - количество друзей Васи. В следующих N строках записано по два целых числа Ai и Bi (оба числа от 1 до 109) - возможное время приезда i-го друга. Формат вывода Выведите N пар чисел Li и Ri - номера дней, в которые приедет и уедет i-й друг соответственно (Ai ≤ Li ≤ Ri ≤ Bi). Если i-го друга приглашать не нужно, выведите пару чисел -1 -1. Если правильных ответов несколько - выведите любой из них.

Ответы на вопрос

Ответ:
Объяснение:
#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
int N, A, B;
cin >> N;
vector < vector <int>> IO;
int lastDay = 0;
for (int i = 0; i < N; i++) {
cin >> A >> B;
IO.push_back(vector<int>());
IO[i].push_back(A);
IO[i].push_back(B);
IO[i].push_back(i);
}
sort(IO.begin(), IO.end());
for (int i = 0; i < N; i++)
{
if (lastDay >= IO[i][1]) {
IO[i][0] = -1;
IO[i][1] = -1;
}
else {
if (lastDay < IO[i][0]) {
lastDay = IO[i][1];
}
else if (lastDay >= IO[i][0]) {
IO[i][0] = lastDay+1;
lastDay = IO[i][1];
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (IO[j][2] == i) {
cout << IO[j][0] << " " << IO[j][1] << endl;
break;
}
}
}
return 0;
}



Для решения этой задачи мы можем воспользоваться жадным методом.
- Сначала отсортируем всех друзей по дате приезда в порядке возрастания.
- Заведем переменную
current_day
, которая будет представлять текущий день. - Для каждого друга по порядку: a. Если день приезда друга (Ai) больше, чем текущий день, то это идеальный день для его приезда. Устанавливаем Li равным Ai и Ri равным Bi, а также обновляем текущий день (current_day = Bi + 1). b. Если день приезда друга (Ai) меньше или равен текущему дню, то друг не может приехать в этот день, и мы проверяем следующий доступный день для его приезда, увеличивая current_day до Ai. После этого снова выполняем шаг 3a.
Вот Python-код, который решает задачу:
python# Ввод данных
n = int(input())
friends = []
for i in range(n):
a, b = map(int, input().split())
friends.append((a, b, i + 1))
# Сортировка друзей по дате приезда
friends.sort()
current_day = 1
result = []
for friend in friends:
a, b, i = friend
if a > current_day:
result.append((a, b))
current_day = b + 1
else:
next_day = max(current_day, a)
if next_day <= b:
result.append((next_day, b))
current_day = b + 1
else:
result.append((-1, -1))
# Вывод результата
for l, r in result:
print(l, r)
Этот код сначала сортирует друзей по дате приезда, затем использует жадный метод для определения дат приезда и отъезда каждого друга, учитывая условия задачи.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili