C++ задача "Превышение скорости" acmp
Условие задачи: Превышение скорости является опасным нарушением, значительно увеличивающим вероятность трагических последствий транспортных происшествий. К сожалению контроль скорости с использованием радаров и камер не решает проблему полностью. Притормаживая перед камерами, водители едут со значительным превышением на участках дорог, где контроль не ведётся. С целью предотвращения такого поведения используется назначение штрафа за гарантирование превышение скорости, основанное на времени проезда дороги.
Рассмотрим дорогу, состоящую из n участков, пронумерованных от 1 до n. Длина i-го участка составляет li метров. На i-м из участков установлено ограничение по скорости в vi м/с.
За превышение скорости предусмотрены штрафы. В зависимости от превышения, установлены различные штрафы, величина штрафа вычисляется следующим образом.
Пусть e — максимальное превышение разрешённой скорости в процессе пребывания автомобиля на всей дороге, то есть максимальная разница между скоростью автомобиля и максимальной разрешенной скоростью на участке, где он в этот момент находится. Если превышения скорости не было, то штраф не взимается. В противном случае штраф вычисляется так:
если 0 < e ≤ a1, то штраф составляет f1 денежных единиц; если a1 < e ≤ a2, то штраф составляет f2 денежных единиц; . . . если am−2 < e ≤ am−1, то штраф составляет fm−1 денежных единиц; если am−1 < e, то штраф составляет fm денежных единиц. Таким образом, есть m диапазонов превышения скорости и соответствующие им штрафы.
Автоматическая система назначения штрафов получила данные о q автомобилях. Для удобства пронумеруем их от 1 до q. Известно, что i-й автомобиль заехал на дорогу в момент времени si, проехал все n участков, после чего выехал с нее в момент времени ti. Отсчёт времени будем вести в секундах с открытия дороги.
Для каждого из автомобилей система должна определить, какой максимальный штраф можно гарантированно выписать этому автомобилю, основываясь только на времени заезда на дорогу и выезда с нее.
Требуется написать программу, которая по описанию границ диапазонов превышения скорости, соответствующих штрафов и временам въезда/выезда автомобилей определяет для каждого автомобиля максимальный штраф, который можно выписать этому автомобилю.
Входные данные Первая строка входного файла INPUT.TXT содержит единственное целое число n — количество участков на дороге (1 ≤ n ≤ 10).
Вторая строка содержит n целых чисел vi — ограничения скорости на участках (1 ≤ vi ≤ 109).
Третья строка содержит n целых чисел li — длины участков (1 ≤ li ≤ 109).
Четвертая строка содержит единственное целое число m — количество границ диапазонов превышения скорости (1 ≤ m ≤ 105).
Пятая строка содержит m − 1 целых чисел ai — границы диапазонов превышения скорости (1 ≤ ai ≤ 109). Гарантируется, что значения ai строго возрастают. Обратите внимание, что если m = 1, то пятая строка ввода пустая.
Шестая строка содержит m целых чисел fi — штрафы за диапазоны превышения скоростей (1 ≤ fi ≤ 109). Гарантируется, что значения fi возрастают.
Седьмая строка содержит единственное целое число q — количество автомобилей, которые надо обработать (1 ≤ q ≤ 105).
Каждая из следующих q строк содержит два целых числа si и ti — время заезда на трассу и выезда с неё i-го из рассматриваемых автомобилей (1 ≤ si < ti ≤ 109)
Выходные данные Для каждого из q автомобилей в выходной файл OUTPUT.TXT выведите в отдельной строке максимальный штраф, который гарантированно можно выписать этому автомобилю, основываясь только на временах его заезда на дорогу и выезда с нее. Если возможна ситуация, что автомобиль ни разу не превысил разрешённую скорость, следует вывести 0.
Гарантируется, что если время въезда или выезда автомобиля изменить не более чем на 10−5, штраф, который можно ему выписать, не изменится. https://acmp.ru/asp/do/index.asp?main=task&id_course=3&id_section=24&id_topic=270&id_problem=1762
Задачу решил бинарным поиском, но она валит 22 тест, не могу понять проблему... Код:
#include <map>
using namespace std;
int main()
{
int n, m, q, in, out, left, right;
double time=0, t=0;
cin >> n;
int lims[n];
double lens[n];
for (int i=0; i<n; i++)
{
cin >> lims[i];
}
for (int i=0; i<n; i++)
{
cin >> lens[i];
t += lens[i]/lims[i];
}
cin >> m;
int flims[m];
int fines[m];
for (int i=0; i<m-1; i++)
{
cin >> flims[i];
}
for (int i=0; i<m; i++)
{
cin >> fines[i];
}
cin >> q;
for(int i=0; i<q; i++)
{
cin >> in >> out;
if (-0.00001 <= out-in-t)
{
cout << 0 << endl;
continue;
}
time = 0;
for (int j=0; j<n; j++)
{
time += lens[j]/(lims[j]+flims[m-2]);
}
if (0.00001 > out-in-time)
{
cout << fines[m-1] << endl;
continue;
}
else
{
left = 0;
right = m-1;
while (left<right-1)
{
time = 0;
for (int j=0; j<n; j++)
{
time += lens[j]/(lims[j]+flims[(right+left)/2]);
}
if (-0.00001 < out-in-time){right=(right+left)/2;}
else {left=(right+left)/2;}
}
cout << fines[right] << endl;
}
}
}