Матч
391, Снежная зима (SnowyWinter)
Дивизион 2,
Уровень 1
Имеется трасса, частями покрытая
снегом. Массивы startPoints и endPoints содержат начала и концы отрезков,
занесенных снегом. Необходимо вычислить общую длину трассы, покрытую снегом.
Отрезки (startPoints[i], endPoints[i]) могут перекрываться.
Класс: SnowyWinter
Метод: snowyHighwayLength(vector<int>
startPoints,
vector<int>
endPoints)
Ограничения: startPoints и endPoints содержат одинаковое
количество элементов, от 1 до 50, 1 £ startPoints[i],
endPoints[i] £ 20, startPoints[i] <
endPoints[i].
Вход. Два массива startPoints и endPoints, описывающие координаты начал и
концов отрезков.
Выход. Общая длина трассы, покрытая снегом.
Пример входа
startPoints |
endPoints |
{17,85,57} |
{33,86,84} |
{45,100,125,10,15,35,30,9} |
{46,200,175,20,25,45,40,10} |
Пример выхода
44
132
РЕШЕНИЕ
обработка массивов
Представим
каждый отрезок в виде пары (startPoints[i],
endPoints[i]), занесем их в массив v
и отсортируем по координате начала. В конец массива занесем фиктивный отрезок
(+µ, +µ). Двигаемся по отрезкам слева
направо. Если начало следующего отрезка больше конца текущего, то прибавляем
длину текущего отрезка к сумме. Иначе увеличиваем правый конец текущего отрезка
до правого конца следующего.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
class SnowyWinter
{
public:
int snowyHighwayLength(vector<int> startPoints, vector<int> endPoints)
{
int i, b, e, res;
vector<pair<int,int> > v;
for(res = i = 0; i <
startPoints.size(); i++)
v.push_back(make_pair(startPoints[i],endPoints[i]));
sort(v.begin(),v.end());
v.push_back(make_pair(2000000000,2000000000));
b = e = -1;
for(i = 0; i < v.size(); i++)
{
if (v[i].first > e)
{
res += e - b;
b = v[i].first; e = v[i].second;
}
else e = max(e,v[i].second);
}
return res;
}
};