Матч 418, Башни (Towers)

Дивизион 2, Уровень 1

 

Рассмотрим игру, в которой Ваши солдаты атакуют башни противника. Перед атакой у Вас имеется myUnits солдат. За один раунд атаки каждый Ваш солдат наносит урон одной из башен в размере одной единицы. У Вашего оппонента солдат нет. Изначально имеется numT башен, каждая из которых разрушается при получении урона в hpT единиц. После вашей атаки каждая неразрушенная башня убивает attackT Ваших солдат.

Вам необходимо разрушить все башни. Если это возможно, то вернуть наименьшее число раундов, за которое это можно совершить. Иначе вернуть -1.

 

Класс: Towers

Метод: int attack(int myUnits, int hpT, int attackT, int numT)

Ограничения: 1 £ myUnits £ 1000000, 1 £ hpT, attackT, numT £ 10000.

 

Вход. Количество Ваших солдат перед атакой myUnits, количество башен numT, прочность каждой башни hpT и количество солдат attackT, которое убивает каждый раунд каждая целая башня.

 

Выход. Наименьшее число раундов, за которое можно разрушить все башни. Вернуть -1, если этого совершить нельзя.

 

Пример входа

myUnits

hpT

attackT

numT

13

2

3

8

10

6

8

2

10

6

9

2

10000

10

2

2789

 

Пример выхода

2

2

-1

10

 

 

РЕШЕНИЕ

моделирование

 

Очевидно, что башни следует разрушать последовательно, одна за другой. Суммарная прочность всех башен равна points = numT * hpT. Она будет уменьшаться каждый раунд на число имеющихся у Вас солдат myUnits. Число Ваших солдат myUnits после атаки будет уменьшаться на количество оставшихся целых башен (points + hpT – 1) / hpT , умноженное на attackT. Сражение заканчивается, когда либо после Вашей атаки все башни будут разрушены (points £ 0), либо у Вас не останется солдат после атаки соперника (игра продолжается пока myUnits > 0).

 

ПРОГРАММА

 

#include <stdio.h>

 

class Towers

{

public:

  int attack(int myUnits, int hpT, int attackT, int numT)

  {

    int points = numT * hpT, rounds = 0 ;

    while(myUnits > 0)

    {

      rounds++;

      points -= myUnits;

      if (points <= 0) break;

      myUnits = myUnits - (points + hpT - 1) / hpT  * attackT;

    }

    return (myUnits <= 0) ? -1 : rounds;

  }

};