Задача Ю2.22. Голодная зима. Суточный рацион коровы составляет [latex]u[/latex] кг сена, [latex]v[/latex] кг силоса и [latex]w[/latex] кг комбикорма. В хозяйстве, содержащем стадо из [latex]k[/latex] голов, осталось [latex]s[/latex] центнеров сена, [latex]t[/latex] тонн силоса и [latex]f[/latex] мешков комбикорма по 50 кг. Сколько ещё дней хозяйство сможет кормить коров по полному рациону? Какой из кормов кончится раньше других?
[latex]u[/latex] | [latex]v[/latex] | [latex]w[/latex] | [latex]s[/latex] | [latex]t[/latex] | [latex]f[/latex] | [latex]k[/latex] | Результат. | Комментарий. |
1 | 0,5 | 3 | 3 | 0,2 | 7 | 15 | 7. Комбикорм. | Тест пройден. |
4 | 7 | 5 | 6 | 0,6 | 8 | 13 | 6. Комбикорм. | Тест пройден. |
8 | 5 | 3,5 | 4 | 1 | 9 | 11 | 4. Сено. | Тест пройден. |
1 | 1 | 1 | 1 | 0,1 | 2 | 2 | 50. Сено. Силос. Комбикорм. | Тест пройден. |
C++:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { double u, v, w; // Количество корма на 1 день 1 корове. double s, t, f; // Количество имеющегося корма. Измеряется в других единицах! int k; // Количество голов в стаде. Натуральное число. scanf ("%lf %lf %lf %lf %lf %lf %d", &u, &v, &w, &s, &t, &f, &k); // Ввод данных. double a, b, c; // Вспомогательные переменные для вычисления количества дней, на которое хватит каждого корма отдельно. a=(100*s)/(k*u); b=(1000*t)/(k*v); c=(50*f)/(k*w); if((lround(fmin (a, fmin (b, c)))-fmin (a, fmin (b, c)))>0){ printf ("Полноценный рацион будет соблюдаться %d полных дней. \n", lround(fmin (a, fmin (b, c)))-1); } else { printf ("Полноценный рацион будет соблюдаться %d полных дней. \n", lround(fmin (a, fmin (b, c)))); } if ((a<=b)&&(a<=c)) { if ((a==b)&&(a!=c)) { puts ("Сено. Силос."); } else if ((a==c)&&(a!=b)) { puts ("Сено. Комбикорм."); } else if ((a==b)&&(a==c)) { puts ("Сено. Силос. Комбикорм."); } else { puts ("Сено."); } } else if ((b<=a)&&(b<=c)) { if ((b==c)&&(b!=a)) { puts ("Силос. Комбикорм."); } else { puts ("Силос."); } } else { puts ("Комбикорм."); } return 0; } |
Java:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import java.util.*; import java.lang.*; import java.io.*; import java.math.*; class Ideone { public static void main (String[] args) { Scanner in = new Scanner (System.in); double u, v, w, s, t, f; int k; u=in.nextDouble(); v=in.nextDouble(); w=in.nextDouble(); s=in.nextDouble(); t=in.nextDouble(); f=in.nextDouble(); k=in.nextInt(); double a, b, c; a=(100*s)/(k*u); b=(1000*t)/(k*v); c=(50*f)/(k*w); if ((Math.round(Math.min(a, Math.min(b,c)))-Math.min(a, Math.min(b,c)))>0) { System.out.format ("Полноценный рацион будет соблюдаться %d полных дней. %n", Math.round(Math.min(a, Math.min(b,c)))-1); } else { System.out.format ("Полноценный рацион будет соблюдаться %d полных дней. %n", Math.round(Math.min(a, Math.min(b,c)))); } if ((a<=b)&&(a<=c)) { if ((a==b)&&(a!=c)) { System.out.println("Сено. Силос."); } else if ((a==c)&&(a!=b)) { System.out.println("Сено. Комбикорм."); } else if ((a==b)&&(a==c)) { System.out.println ("Сено. Силос. Комбикорм."); } else { System.out.println("Сено."); } } else if ((b<=a)&&(b<=c)) { if ((b==c)&&(b!=a)) { System.out.println ("Силос. Комбикорм."); } else { System.out.println("Силос."); } } else { System.out.println("Комбикорм."); } } } |
По условию задачи необходимо найти количество полных дней, в течение которых корова будет обеспечен полный рацион.
Так как изначально в условии задачи данные различались по единицам измерения, я перевела их все в килограммы. Так же было предусмотрено, что количество килограмм может быть дробным положительным, в то время как количество голов в стаде — только натуральным. Для удобства вычисления я ввела дополнительные переменные [latex]a[/latex], [latex]b[/latex], [latex]c[/latex].
Затем я столкнулась с проблемой округления полученного минимального дробного числа к целому количеству дней. Возьмём первый тест для примера. Минимальное дробное количество дней — 7,77. Функция lround округляет число лишь к ближайшему целому. Поэтому мне потребовалось ввести проверку. Если разница между округлённым минимальным и неокруглённым больше нуля, то программа вычитает из полученного значения единицу. Таким образом программа не считает дни, когда корма бы хватило лишь на определённую часть суток.
Следующей задачей было выведение на экран данных о корме, который закончится первым. Тут я действовала по принципу элементарного сравнения.
В программе использован тип данных с плавающей точкой.
Для выполнения программы и проверки тестов можно воспользоваться следующим объектом (C++) и этим (Java).
Вместо неудобной для этой задачи функции lround можно было использовать floor, которая округляет значении вниз, правда формально возвращает вещественное число. Чтобы получить целое число применяем приведение типов: (int) floor (...)
Проверки на закончившиеся ресурсы можно упростить, если сделать отдельные проверки для сена, силоса, комбикорма.
Задача засчитана (10 баллов).
Засчитана Java версия.