Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: alexu007 от Май 11, 2022, 15:14



Название: Задача о 2-х велосипедистах и электромобиле.
Отправлено: alexu007 от Май 11, 2022, 15:14
Цитировать
Два велосипедиста выехали одновременно из пункта A по одной дороге с различными скоростями u и v метров в секунду. Через t секунд им вдогонку выехал электромобиль и через некоторое время обогнал одного, а затем и другого велосипедиста. При этом интервал между моментами обгона составил d секунд.

Вы должны написать программу , которая вычислит скорость движения электромобиля.

Формат входных данных
На вход через пробел подаются четыре натуральных числа: u, v, t, d. При этом u != v; u, v <= 50; t, d <= 10000. Гарантируется, что введенные данные будут таковы, что ответ не превысит 200.

Формат выходных данных
Программа должна вывести одно вещественное число — скорость электромобиля.

Методика проверки и пояснение к тесту
Ответ участника считается верным, если он отличается от ответа жюри не более чем на 10^-8.

Программа проверяется на 10 тестах. Прохождение каждого теста оценивается в 2 балла. При этом в первых пяти тестах ответ обязательно будет целым числом. Тест из условия задачи при проверке не используется.

Рассмотрим тест из примера. Утверждается, что для заданных параметров ответом является 12. Проверим это. Можно вычислить, что электромобиль, двигаясь со скоростью 12 м/с. догонит обгонит более медленного велосипедиста на расстоянии 480 метров, а более быстрого на расстоянии в 1200 метров. Действительно электромобиль преодолеет 480 и 1200 метров за 40 и 100 секунд соответственно. Таким образом, интервал между моментами обгона действительно равен 60. Велосипедисты до моментов обгона будут двигаться на 20 секунд дольше, по 60 и 120 секунд соответственно. И, проверив пройденное расстояние 60*8=480 и 120*10=1200, убедимся, что ответ верен. Обратите внимание, что это пояснение лишь показывает, как проверить правильность ответа, но не является алгоритмом решения.

Пример ввода:
10 8 20 60

Пример вывода:
12.0
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <qmath.h>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

public slots:
    void press_pbtn_01();
};

#endif // WIDGET_H


Код:
#include "widget.h"
#include "ui_widget.h"



Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}



Widget::~Widget()
{
    delete ui;
}



void Widget::press_pbtn_01()
{
    QString str;

    str = ui->lineEdit_01->text();
    double u = str.toDouble();
    str = ui->lineEdit_02->text();
    double v = str.toDouble();
    str = ui->lineEdit_03->text();
    double t = str.toDouble();
    str = ui->lineEdit_04->text();
    double d = str.toDouble();

    double v_max = 200;
    double v_min = u;

    double x, s1, s2, vmash;

    while(qAbs(v_max - v_min) > 1e-12)
    {
        vmash = (v_max + v_min) / 2;

        s1 = vmash * (u * t) / (vmash - u);
        s2 = vmash * (v * t) / (vmash - v);

        x = qAbs(s1 - s2) / vmash;

        if(x < d) v_max = vmash;
        if(x > d) v_min = vmash;
    }

    ui->label_01->setText(QString::number(s1, 'g', 12));
    ui->label_02->setText(QString::number(s2, 'g', 12));
    ui->label_03->setText(QString::number(vmash, 'g', 12));
}


Название: Re: Задача о 2-х велосипедистах и электромобиле.
Отправлено: qtkoder777 от Май 11, 2022, 16:09
Такие задачи мы решали в 3-м классе. Смысл в программе какой? 3 поля на форму кинуть?


Название: Re: Задача о 2-х велосипедистах и электромобиле.
Отправлено: alexu007 от Май 11, 2022, 19:30
В третьем классе чего - школы?
У современных студентов даже такая задача вызывает затруднения...