
Указания к решению упражнений
Упражнение 4.1. [Топкодер, SRM 193, SwimmingPool]. Вычисляем объем воды, которой наполнилась лужа. Разделив полученный объем на высоту, получим площадь поперечного разреза лужи.
#include <cstdio>
#include <vector>
using namespace std;
class SwimmingPool
{
public:
int area(vector<int> rates, vector<int> durations, int height)
{
int i, vol = 0;
for(i = 0; i < rates.size(); i++)
vol += rates[i] * durations[i];
return vol / height;
}
};
Упражнение 4.2. [Топкодер, SRM 194, Soccer]. Для каждой команды вычисляем полученное количество очков в лиге. Среди набранного количества очков каждой командой находим наибольшее значение.
#include <cstdio>
#include <vector>
using namespace std;
class Soccer
{
public:
int maxPoints(vector<int> wins, vector<int> ties)
{
int i, max = 0;
for(i = 0; i < wins.size(); i++)
if (wins[i] * 3 + ties[i] > max) max = wins[i] * 3 + ties[i];
return max;
}
};
Упражнение 4.3. [Топкодер, SRM 315, RosePetals]. Заведем массив petals, в котором petals[i] содержит количество лепестков грани с числом i. Проходим по массиву dice и суммируем количество лепестков, грань с числом dice[i] содержит petals[dice[i]] лепестков.
#include <cstdio>
#include <vector>
using namespace std;
class RosePetals{
public:
int getScore(vector<int> dice)
{
int i, res, petals[] = {0,0,0,2,0,4,0};
for(res = i = 0; i < 5; i++) res += petals[dice[i]];
return res;
}
};
Упражнение 4.4. [Топкодер, SRM 212, YahtzeeScore]. Очевидно, что игрок будет называть число от 1 до 6. Для каждого такого названого числа подсчитаем сумму очков, которое он бы получил. Среди всех найденных сумм очков найдем наибольшую.
#include <cstdio>
#include <vector>
using namespace std;
class YahtzeeScore
{
public:
int maxPoints(vector<int> toss)
{
int i, j, s, max;
for(max = 0, i = 1; i <= 6; i++)
{
for(s = j = 0; j < 5; j++)
if (toss[j] == i) s += i;
if (s > max) max = s;
}
return max;
}
};
Упражнение 4.5. [Топкодер, SRM 217, FuelConsumption]. Скорость движения автомобиля должна равняться такому velocities[i], для которого отношение d = velocities[i] / consumptions[i] является наибольшим. Отношение d равно расстоянию, которое можно проехать на одном литре бензина. Максимальное расстояние, которое может проехать автомобиль, равно fuel * d.
#include <cstdio>
#include <vector>
using namespace std;
class FuelConsumption{
public:
double maximalDistance(vector<int> velocities, vector<int> consumptions,
int fuel)
{
double d = 0;
for(int i = 0; i < velocities.size(); i++)
if (1.0 * velocities[i] / consumptions[i] > d)
d = 1.0 * velocities[i] / consumptions[i];
return fuel * d;
}
};
Упражнение 4.6. [Топкодер, SRM 253, ObjectPacking]. Пусть ширина текущей коробки равна W, длина – L. Объект с размерами objWidth и objLength можно поместить в коробку, если выполняется условие
(W >= objWidth) && (L >= objLength)
или
(W >= objLength ) && (L >= objWidth)
Перебираем все коробки, проверяем, можно ли в них поместить имеющийся объект. Если можно – то вычисляем площадь коробки. Находим наименьшую площадь такой коробки.
#include <cstdio>
#include <vector>
using namespace std;
class ObjectPacking
{
public:
int smallBox(int objWidth, int objLength,
vector<int> boxWidth, vector<int> boxLength)
{
int W, L, i, res = 1000000000;
for(i = 0; i < boxWidth.size(); i++)
{
W = boxWidth[i]; L = boxLength[i];
if (((W >= objWidth) && (L >= objLength)) ||
((W >= objLength ) && (L >= objWidth)))
if (W * L < res) res = W * L;
}
return (res == 1000000000) ? -1:res;
}
};
Упражнение 4.7. [Топкодер, SRM 322, DerivativeSequence]. Задача решается моделированием процесса вычисления разностей.
#include <cstdio>
#include <vector>
using namespace std;
class DerivativeSequence
{
public:
vector<int> derSeq(vector<int> a, int n)
{
int i;
while(n--)
{
for(i = 0; i < a.size(); i++) a[i] = a[i+1] - a[i];
a.erase(a.end() - 1);
}
return a;
}
};