Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections / lection 6.doc
Скачиваний:
24
Добавлен:
19.03.2015
Размер:
190.46 Кб
Скачать

Указания к решению упражнений

Упражнение 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;

}

};

Соседние файлы в папке Lections