Задача: Леспромхоз ведёт заготовку деловой древесины. Первоначальный объем её на территории леспромхоза составлял [latex]p[/latex] кубометров. Ежегодный прирост составляет [latex]k[/latex]%. Годовой план заготовки — [latex]t[/latex] кубометров. Через сколько лет в бывшем лесу будут расти одни опята?
- Тесты:
[latex]p[/latex] | [latex]k[/latex]% | [latex]t[/latex] | [latex]years[/latex] | Комментарий |
111.50 | 14.57 | 16 | Никогда | Пройден: прирост компенсирует вырубку |
0 | 0 | 0 | 0 | Пройден: абстрактный случай, но результат верный |
20 | 10 | 30 | 1 | Пройден |
200 | 30 | 61 | 16 | Пройден |
- Программный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <cstdio> int main() { double p = 0; scanf( "%lf", &p ); double k = 0; scanf( "%lf", &k ); k /= 100; //перевод процентов в вид для расчетов double t = 0; scanf( "%lf", &t ); int years = 0; if ( (p*(1 + k)-t) < p ) { p = p * ( 1 + k ) - t; years++; } printf( "%d", years ); } else { printf("Никогда: система гармонична. "); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.*; import java.lang.*; import java.io.*; import java.math.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double p = in.nextDouble(); double k = in.nextDouble(); k /= 100; //нормализация процентов double t = in.nextDouble(); int years = 0; if(p*(1+k)-t < p){ //если прирост не компенсирует вырубку while(p > 0){ p = p*(1+k)-t; years++; } System.out.println(years); } else{ System.out.println("Никогда: система гармонична."); } } } |
-
Формализация задачи:
Дано начальное значение [latex]p \ge 0[/latex]. На [latex]i[/latex]-м шаге оставшийся объем древесины вычисляется из рекуррентного соотношения: [latex]p_{i} = p_{i-1} (1 + \frac {k}{100})-t[/latex]. (*)
Определить шаг [latex]i[/latex] такой, что [latex]p_{i}<0[/latex]. -
Алгоритм решения:
Шаг 1: Проверка условия [latex]p_{1}[/latex] меньше [latex]p[/latex]. В случае, если если естественный прирост не компенсирует вырубку, начать рассчет. В противном случае лес никогда не опустеет, так как прирост и убыль скомпенсированы.
Шаг 2: До тех пор, пока [latex]p_{i}>0[/latex], рассчитывать [latex]p_{i}[/latex] по соотношению (*), где [latex]i[/latex] — количество прошедших лет. -
Детали реализации:
В задаче используются два типа данных: целочисленный и с плавающей точкой двойной точности. Выбор продиктован отсутствием указания на конкретный тип входных данных в условии задачи. Протестировать работу программы можно по ссылке.
Реализация на Java: http://ideone.com/fyuDTg
Поправьте, пожалуйста отступы и условие внутри if, вставьте потерянный цикл .
Парсер отчего-то полюбил символы «» настолько, что везде принимает их за тэги html. В тексте отчета эту проблему я поборол, а от кода не ожидал. Сейчас исправлю.
Не хотите поправить отступы здесь и на сайте в 10 и 19 строке?
Это обязательное требование.
Исправлено.
Java версия засчитана, 10 баллов.