Как успеть подешевле? Можно ехать на такси со скоростью [latex]v_{1}[/latex] км/ч и оплатой [latex]p_{1}[/latex] pуб/км либо идти пешком со скоростью [latex]v_{2}[/latex] км/ч бесплатно. Как с наименьшими затратами преодолеть путь [latex]s[/latex] за время [latex]t[/latex], если это возможно? Каковы эти затраты?
v1 | v2 | s | t | p1 | Результат: |
30 | 5 | 18 | 2 | 4 | 0 |
50.44 | 4 | 75.7 | 3 | 5.5 | 174.975969 |
62 | 5 | 800 | 5 | 7 | No time |
8 | 17 | 60 | 3 | 8 | 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 28 29 30 31 32 33 |
#include <iostream> #include <cmath> using namespace std; int main() { double v1, v2, p1, s, t, p; //Описание переменных для хранения входных данных. scanf("%lf %lf %lf %lf %lf", &v1, &v2, &p1, &s, &t); //Чтение из стандартного потока. if(v1 == v2){ if(s / v2 <= t){ printf("0"); return 0; } else{ printf("No Time"); return 0; } } double T = (s - t * v2) / (v1 - v2); // Формула для нахождения минимального времени езды на такси. if(s / v2 <= t) //Первый случай, когда можно успеть добраться пешком, следовательно оплата равна 0. printf("0"); else if( v1 <= v2 ) { // Случай, когда скорость пешком больше или равна скорости такси. if( v2 * t < s ) printf("No time"); else printf("0"); } else if(T <= t) { //Если только пешком добраться нельзя, часть пути едет на такси, остаток идет. p=(T * v1) * p1; printf("%lf", p); } else { printf("No time"); } //Если нельзя успеть ни пешком, ни на такси. return 0; } |
По условию задачи нужно выяснить, как с наименьшими затратами преодолеть путь [latex]s[/latex] за время [latex]t[/latex], если это возможно. Вводим переменные с типом данных “double”, так как переменные входят в множество действительных чисел. Необходимо рассмотреть несколько случаев.
Первый случай, когда можно успеть добраться пешком, то есть [latex]s/v_{2}<t[/latex], следовательно оплата равна [latex]0[/latex].
Второй случай, когда скорость пешком больше или равна скорости такси. Если при этом пешком успеть нельзя, тогда выводим «No time», если пешком успеем, то оплата равна 0.
Третий случай, когда можно часть пути проехать на такси, а остаток пройти пешком так, чтобы затраты были минимальными. Для этого надо формулу: [latex]s=v_{1} \cdot t_{1}+v_{2} \cdot t_{2}[/latex] преобразовать в вид: [latex]s=t_{1} \cdot v_{1}+t \cdot v_{2}-t_{1} \cdot v2[/latex] и выразить [latex]t_{1}[/latex], введя переменную [latex]T[/latex](минимальное время езды на такси).
[latex]T = (s-t \cdot v_{2}) / (v_{1}-v_{2})[/latex].
В результате получаем формулу:
[latex]p=(T \cdot v_{1}) \cdot p_{1}[/latex] и считаем [latex]p[/latex].
И наконец четвертый случай, если невозможно успеть вовремя ни на такси, ни пешком.
Для проверки работы программы можно воспользоваться объектом.
Код программы на 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 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double v1, v2, s, t, p, p1; v1 = in.nextDouble(); v2 = in.nextDouble(); s = in.nextDouble(); t = in.nextDouble(); p1 = in.nextDouble(); if(v1 == v2){ if(s / v2<=t){ System.out.println("0"); return; } else{ System.out.println("No Time"); return; } } double T = (s - t * v2) / (v1 - v2); if( s / v2 <= t){ System.out.println("0"); } else if( v1 <= v2 ) { if( v2 * t < s ){ System.out.println("No time"); } else{ System.out.println("0"); } } else if(T <= t) { p=(T * v1) * p1; System.out.println(p); } else{ System.out.println("No time"); } } } |
Ссылка на Java код.