Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите не прошу задача на C++

жоски программист Ученик (58), открыт 3 дня назад
Фаина собирается спать, но ей нужно рано проснуться. Для этого она установила n будильников на разное время между 7:00 и 9:00 утра. Однако Фаина спит очень крепко и знает, что для того, чтобы проснуться, ей нужно услышать как минимум три будильника в течение 10 минут. Это означает, что для каких-то трех будильников разница между самым ранним и самым поздним будильником должна составлять 10 минут или меньше.

Фаина не уверена, достаточно ли у неё будильников, чтобы гарантированно проснуться, и беспокоится о том, что может проспать. Поэтому она хочет установить дополнительные будильники. Все новые будильники также должны быть установлены между 7:00 и 9:00, и все будильники (как старые, так и новые) должны быть на разное время.

Ваша задача — определить минимальное количество дополнительных будильников, которые Фаина должна установить, чтобы быть уверенной, что она проснется. Если она уже может быть уверена в этом, то количество дополнительных будильников равно 0.

▎Входные данные

• Первая строка содержит одно целое число n — количество будильников, которые установила Фаина (1 ≤ n ≤ 20).

• Следующие n строк содержат время i-го будильника в формате h:mm (где 7 ≤ h ≤ 9 и 00 ≤ mm ≤ 59). Будильники указаны в строго возрастающем порядке времени.

▎Выходные данные

• Выведите минимальное количество дополнительных будильников, которые Фаина должна установить, чтобы гарантировать
пробуждение.
4 ответа
Петушок Петушочек Знаток (270) 3 дня назад
Вроде 3 будет
жоски программистУченик (58) 3 дня назад
Какой 3 мне код нужен
Петушок Петушочек Знаток (270) жоски программист, ладно 5
Monster beats 2000 Мудрец (12385) 3 дня назад
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// Преобразование времени в минуты с 7:00
int timeToMinutes(string time) {
int hours = stoi(time.substr(0, 1));
int minutes = stoi(time.substr(2, 2));
return (hours - 7) * 60 + minutes;
}

int minAdditionalAlarms(vector<int>& times) {
int n = times.size();
if (n < 3) return 3 - n; // Если меньше 3 будильников

// Проверяем все возможные тройки будильников
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
// Если разница между крайними будильниками <= 10 минут
if (times[k] - times[i] <= 10) {
return 0; // Дополнительные будильники не нужны
}
}
}
}

// Если не нашли подходящую тройку, нужен как минимум 1 будильник
int minNeeded = 1;

// Проверяем каждый интервал в 10 минут
for (int start = 0; start <= 120; start++) {
int count = 0;
for (int time : times) {
if (time >= start && time <= start + 10) {
count++;
}
}
// Если в интервале уже есть 2 будильника, нужен только 1
if (count >= 2) {
return 1;
}
}

return 2; // Иначе нужно минимум 2 будильника
}

int main() {
int n;
cin >> n;

vector<int> times;
for (int i = 0; i < n; i++) {
string time;
cin >> time;
times.push_back(timeToMinutes(time));
}

cout << minAdditionalAlarms(times) << endl;

return 0;
}
Александр Смирнов Ученик (100) 3 дня назад
Я отвечу на ваш вопрос как специалист по программированию. Ниже приведена пошаговая инструкция для решения задачи на C++.

Подход к решению

Обработка входных данных: Считать количество будильников и их время.

Преобразование времени: Преобразовать время в минуты, чтобы легче было сравнивать.

Итерация: Использовать три вложенных цикла для проверки всех возможных комбинаций будильников.

Подсчет дополнительных будильников: Если не удается найти три будильника за 10 минут, добавлять новые будильники и повторять проверку, пока не будет достигнута цель.
Код

Вот пример кода на C++ для решения задачи:

cpp

Копировать код
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// Функция для преобразования времени в минуты
int timeToMinutes(const string& time) {
int h = stoi(time.substr(0, 1));
int m = stoi(time.substr(3, 2));
return h * 60 + m;
}

// Основная функция
int main() {
int n;
cin >> n;
vector<int> alarms(n);

for (int i = 0; i < n; i++) {
string time;
cin >> time;
alarms[i] = timeToMinutes(time);
}

// Проверяем, достаточно ли уже имеющихся будильников
int additional = 0;

// Добавляем будильники до тех пор, пока не достигнем цели
while (true) {
bool found = false;

// Проверяем существующие будильники
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
if (alarms[k] - alarms[i] <= 10) {
found = true;
break;
}
}
if (found) break;
}
if (found) break;
}

if (found) break; // Если нашли три будильника, выходим из цикла

// Если не нашли, добавляем новый будильник
int newAlarm = (alarms.empty()) ? 420 : (alarms.back() + 1); // 420 минут это 7:00
if (newAlarm > 540) break; // 540 минут это 9:00
alarms.push_back(newAlarm);
n++;
additional++;
}

cout << additional << endl;
return 0;
}
Пояснение к коду

Функция timeToMinutes: Преобразует время в формате "h:mm" в общее количество минут с 7:00.

Цикл: Проверяет все комбинации по три будильника. Если находится такая комбинация, программа завершает выполнение.

Добавление будильника: Если не удаётся найти три подходящих будильника, добавляется новый будильник, и количество дополнительных будильников увеличивается.
Вывод

Этот код поможет Фаине узнать, сколько дополнительных будильников ей нужно установить, чтобы быть уверенной в том, что проснётся. Она может использовать этот алгоритм, чтобы избежать случайного проспания.
Lordini Гуру (4493) 3 дня назад
какой ты программист когда элементарную хрень не можешь решить?
Похожие вопросы