Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
1

Вычислить момент времени когда расстояние между лидирующим и замыкающим велосипедистами будет минимальным

27.04.2015, 19:44. Показов 5298. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Велосипедисты, участвующие в шоссейной гонке, в некоторый момент времени, который
называется начальным, оказались в точках, удаленных от места старта на x1, x2, …, xn метров (n –
общее количество велосипедистов). Каждый велосипедист двигается со своей постоянной
скоростью v1, v2, …, vn метров в секунду. Все велосипедисты двигаются в одну и ту же сторону.
Репортер, освещающий ход соревнований, хочет определить момент времени, в который
расстояние между лидирующим в гонке велосипедистом и замыкающим гонку велосипедистом
станет минимальным, чтобы с вертолета сфотографировать сразу всех участников велогонки.

Требуется написать программу, которая по заданному количеству велосипедистов n, заданным
начальным положениям велосипедистов x1, x2, …, xn и их скоростям v1, v2, …, vn, вычислит момент
времени*t, в который расстояние l между лидирующим и замыкающим велосипедистом будет
минимальным.

Ввод. Первая строка содержит целое число n**– количество велосипедистов. В следующих n
строках указаны по два целых числа: xi – расстояние от старта до i-го велосипедиста и vi – его
скорость (0*≤*xi, vi*≤*107).

Вывод. В выходной файл необходимо вывести два вещественных числа: t – время в секундах,
прошедшее от начального момента времени до момента, когда расстояние в метрах между
лидером и замыкающим будет минимальным, l – искомое расстояние. Числа t и l должны иметь
абсолютную или относительную погрешность не более 10-6, что означает следующее. Пусть
выведенное число равно x, а в правильном ответе оно равно y. Ответ будет считаться правильным,
если значение выражения |x*–*y|*/*max{1,*|y|} не*превышает 10-6.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3            5
 
0 40       90 100
 
30 10      100 70
 
40 30      100 70
 
           110 60
 
           120 35
 
Вывод 1    Вывод 2
 
1 30          0.5 5.000000000000
---------------------------------------------------------------------------------------------------------------------------------------
У меня есть некоторые идеи, вообщем они таковы:
1) решить даную задачу используя НОД, а именно:
вычислить tmin замыкаюшего и tmax лидирующего, и найти их НОД, а дальше не пойму, может не так думаю)
2) вот допустим взять велосипедиста (0 40) и (40 30), и найти время за который 1 догонит 2, то время получится 4 часа, а если 2 - 3, то 30 минут, почему тогда в выводе вообще получается 1 час?
3) найти среднее значение скорости и среднее значение пути нескольких велосипедистов, дальше найти какой то опеределенный их НОД и дальше уже от него оттаклкиваться от него?

Правильно ли я мыслю, может есть какая более правильная реализация алгоритма?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2015, 19:44
Ответы с готовыми решениями:

Найти методом биссекций момент времени, когда хранилище будет переполнено
Найти момент времени методом биссекции , когда хранилище будет переполнено (V2=0), определить...

Найти зависимость от времени угла α между векторами скорости и ускорения , его величину в момент времени t
Найти зависимость от времени угла α между векторами скорости и ускорения , его величину в момент...

Момент времени между моментами времени
задача: имеется датаВремя1, в рамках этого датавремя1 есть моментвремени1 в нем делается приход...

Расстояние между первым и последним минимальным элементом
У нас имеется таблица Необходимо найти и вывести минимальные элементы (в данной таблице это три...

19
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
28.04.2015, 03:30 2
Лучший ответ Сообщение было отмечено Kronos0041 как решение

Решение

а расстояния от старта до финиша нет?

Добавлено через 16 минут
вот тебе идея:
1.создаешь класс велосипедист в котором есть 2 параметра велосипедиста + функция которая делает шаг времени(которая меняет xi в зависимости от скорости)
2.создаешь массив этого класса [n]
3.находишь 2х велосипедистов которые в данный момент являются первым и последним и расстояние между ними записываешь в переменную(если расстояние меньше предыдущего конечно)(время тоже записываешь)
4.запускаешь цикл который вызывает функцию шаг времени(например +1минута) для каждого велосипедиста(лучше для этого функцию сделать)
5.goto 3
один минус: неизвестно только сколько шагов надо сделать

Добавлено через 6 часов 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
////////////////////////////////////////////////////////////////////////////////////////////////
/**< Велосипедисты, участвующие в шоссейной гонке, в некоторый момент времени, который
называется начальным, оказались в точках, удаленных от места старта на x1, x2, …, xn метров (n –
общее количество велосипедистов). Каждый велосипедист двигается со своей постоянной
скоростью v1, v2, …, vn метров в секунду. Все велосипедисты двигаются в одну и ту же сторону.
Репортер, освещающий ход соревнований, хочет определить момент времени, в который
расстояние между лидирующим в гонке велосипедистом и замыкающим гонку велосипедистом
станет минимальным, чтобы с вертолета сфотографировать сразу всех участников велогонки.
 
Требуется написать программу, которая по заданному количеству велосипедистов n, заданным
начальным положениям велосипедистов x1, x2, …, xn и их скоростям v1, v2, …, vn, вычислит момент
времени*t, в который расстояние l между лидирующим и замыкающим велосипедистом будет
минимальным.
 
Ввод. Первая строка содержит целое число n**– количество велосипедистов. В следующих n
строках указаны по два целых числа: xi – расстояние от старта до i-го велосипедиста и vi – его
скорость (0*≤*xi, vi*≤*107).
 
Вывод. В выходной файл необходимо вывести два вещественных числа: t – время в секундах,
прошедшее от начального момента времени до момента, когда расстояние в метрах между
лидером и замыкающим будет минимальным, l – искомое расстояние. Числа t и l должны иметь
абсолютную или относительную погрешность не более 10-6, что означает следующее. Пусть
выведенное число равно x, а в правильном ответе оно равно y. Ответ будет считаться правильным,
если значение выражения |x*–*y|* /*max{1,*|y|} не*превышает 10-6. **/
////////////////////////////////////////////////////////////////////////////////////////////
#include <locale>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <conio.h>
#include <ctime>
#include <iomanip>
using namespace std;
 
float t=0; const int n=5;float tz=0;
class vell
{
    float x,v;
 
public:
    vell(float x1,float v1)
    {
        x=x1;v=v1;
    }
 void shag(float sh)
    {
        x=x+(v*sh);
    }
int getx()
 {
     return x;
 }
int getv()
{
    return v;
}
};
vell player[n]=
{
    vell(90,100),
    vell(100,70),
    vell(100,70),
    vell(110,60),
    vell(120,35)
};
vell maxp=vell(0,0);
vell minp=vell(0,0);
void allshag(float i);
 
 
int main() //основная функция
{
 
int a,b1;
float shag, result=999.0,n1,b;
maxp=player[4];
minp=player[0];
 
cout<<endl<<"введите размер шага: ";
cin>>shag;
cout<<endl<<"введите число шагов: ";
cin>>n1;
float limit=n1*shag;
 
for(b=0;b<=limit;b+=shag)
{
maxp=minp=player[0];
for(a=0;a<n;a++)
{
 
 
    if ( player[a].getx()>maxp.getx() )  maxp=player[a];//отбор певого
    if ( player[a].getx()<minp.getx() )   minp=player[a];//отбор втоого
 
}
 
    if((maxp.getx()- minp.getx())<result)
    {
 
tz=t;
     result=(maxp.getx()- minp.getx());
 
    }
 
 
allshag(shag);
 
}
cout<<endl<<"время ";
cout<<fixed<<setprecision(1)<<tz;
cout<<endl<<"расстояние ";
cout<<fixed<<setprecision(1)<<result;
 
 
 
}
void allshag(float i)
{
t+=i;
int a;
for(a=0;a<n;a++)
  player[a].shag(i);
 
 
}
1
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
28.04.2015, 18:51  [ТС] 3
Цитата Сообщение от Iridiscent Посмотреть сообщение
а расстояния от старта до финиша нет?
нет, можно сказать идея правильная)
только вот ответ у вас всегда равен 0, а путь равен 30 км. при любых входных данных
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
28.04.2015, 19:37 4
Цитата Сообщение от Kronos0041 Посмотреть сообщение
любых входных данных
а вы пробывали шаг в 0.1 0.2 и тд?
в тех данных которые записаны чем дальше тем больше расстояние между ними
0
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
28.04.2015, 19:43  [ТС] 5
Тут нужен алгоритм Евклида применить, вот как это сделать...
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
28.04.2015, 19:44 6
too late for this information....
1
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
28.04.2015, 19:49  [ТС] 7
Цитата Сообщение от Iridiscent Посмотреть сообщение
а вы пробывали шаг в 0.1 0.2 и тд?
это в минутах время получается? вы как скорость рассматривали как в км/ч или в м/с или в минутах? а путь в км, м, см?
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
28.04.2015, 20:08 8
это в единицах времени и единицах расстояния за еденицу времени

Добавлено через 55 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3            5
 
0 40       90 100
 
30 10      100 70
 
40 30      100 70
 
           110 60
 
           120 35
 
Вывод 1    Вывод 2
 
1 30          0.5 5.000000000000
допустим 30 40 это означает что за 1 ед времени велосипедист проходит 40 ед расстояния

Добавлено через 14 минут
и в данный момент он на 30 ед расстояния от старта
1
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
28.04.2015, 20:23  [ТС] 9
Цитата Сообщение от Iridiscent Посмотреть сообщение
один минус: неизвестно только сколько шагов надо сделать
ага, вы оказались правы, только от 50 до 100 шагов еще корректно все выполняется, но это очень долго) если вводить шаг на 0.1)
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
28.04.2015, 20:36 10
вы его на калькуляторе что ли выполняете?
у меня задержка есть только при 1млн шагов по 0.1 а так мгновенно всегда показывает
0
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
29.04.2015, 09:24  [ТС] 11
сложность O(N^2n), может и хорошее решение, еще полностью не проверял, но пока что помечу как наилучшее, так как в голову пока ничего не приходило, хотя чувствую, что можно решить за O(N) при алгоритме Евклида)

Добавлено через 1 час 10 минут
вот при таких данных время получается 0.0000
C++
1
2
3
4
5
6
5
90 10
100 70
100 70
110 60
120 35
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
29.04.2015, 13:22 12
1 строка не задана скорость, если скорость у 1 обьекта 0 то единственный момент когда расстояние между максимальным и минимальным самое меньшое это начало отсчета тоесть 0.0000
p.s. вы размер массива изменяли перед тем как добавлять больше 5ти обьектов?
1
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
29.04.2015, 18:45  [ТС] 13
Цитата Сообщение от Iridiscent Посмотреть сообщение
1 строка не задана скорость
кажется понял, то есть в этом случае когда скорость например 10 км в час где 1 игрок, то просто он не попадает в кадр, поэтому время равно 0, так?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
29.04.2015, 20:26 14
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/////////////////////////////////////////////////////////////////////////////////////////
//Велосипедисты, участвующие в шоссейной гонке, в некоторый момент времени, который
//называется начальным, оказались в точках, удаленных от места старта на x1, x2, …, xn метров (n –
//общее количество велосипедистов). Каждый велосипедист двигается со своей постоянной
//скоростью v1, v2, …, vn метров в секунду. Все велосипедисты двигаются в одну и ту же сторону.
//Репортер, освещающий ход соревнований, хочет определить момент времени, в который
//расстояние между лидирующим в гонке велосипедистом и замыкающим гонку велосипедистом
//станет минимальным, чтобы с вертолета сфотографировать сразу всех участников велогонки.
//
//Требуется написать программу, которая по заданному количеству велосипедистов n, заданным
//начальным положениям велосипедистов x1, x2, …, xn и их скоростям v1, v2, …, vn, вычислит момент
//времени*t, в который расстояние l между лидирующим и замыкающим велосипедистом будет
//минимальным.
//
//ВВОД.
//Первая строка содержит целое число n – количество велосипедистов. В следующих n
//строках указаны по два целых числа: xi – расстояние от старта до i-го велосипедиста и vi – его
//скорость (0 ≤ xi, vi ≤ 107).
//
//ВЫВОД.
//В выходной файл необходимо вывести два вещественных числа: t – время в секундах,
//прошедшее от начального момента времени до момента, когда расстояние в метрах между
//лидером и замыкающим будет минимальным, l – искомое расстояние. Числа t и l должны иметь
//абсолютную или относительную погрешность не более 10-6, что означает следующее. Пусть
//выведенное число равно x, а в правильном ответе оно равно y. Ответ будет считаться правильным,
//если значение выражения |x – y| / max{1, |y|} не превышает 10-6.
//
//3            5
//
//0 40       90 100
//
//30 10      100 70
//
//40 30      100 70
//
//           110 60
//
//           120 35
//
//Вывод 1    Вывод 2
//
//1 30          0.5 5.000000000000
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <set>
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_cyclist
{
    int     x_;
    int     v_;
    //-----------------------------------------------------------------------------------
    double  get_x_for_time( double  time )                                          const
    {
        return  x_  +   v_  *   time;
    }
    //-----------------------------------------------------------------------------------
    bool    operator<   ( T_cyclist     const   &   cyclist )                       const
    {
        return      std::make_pair( x_,         v_          )
                <   std::make_pair( cyclist.x_, cyclist.v_  );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::set< T_cyclist     >   T_cyclists;
/////////////////////////////////////////////////////////////////////////////////////////
class   T_race
{
    //-----------------------------------------------------------------------------------
    T_cyclists  cyclists_;
    double      v_max_;
    double      precision_;
    double      group_len_min_;
    double      time_of_group_len_min_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    T_race  (
                T_cyclists  const   &   cyclists,
                double                  v_max,
                double                  precision
            )
        :
        cyclists_               ( cyclists      ),
        v_max_                  ( v_max         ),
        precision_              ( precision     ),
        group_len_min_          (),
        time_of_group_len_min_  ()
    {
        count_group_len_min_and_time();
    }
    //-----------------------------------------------------------------------------------
    double  time_of_group_len_min()                                                 const
    {
        return  time_of_group_len_min_;
    }
    //-----------------------------------------------------------------------------------
    double  group_len_min()                                                         const
    {
        return  group_len_min_;
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    void    count_group_len_min_and_time()
    {
        double  time_L  =   0;
        double  time_R  =   1;
 
        while   (
                        group_len_for_time( time_L )
                    >   group_len_for_time( time_R )
                )
        {
            time_R  *=  2;
        }
 
        find_min_group_len_in_time_segment
            (
                time_L,
                time_R
            );
    }
    //-----------------------------------------------------------------------------------
    void    find_min_group_len_in_time_segment
        (
            double  time_L,
            double  time_R
        )
    {
        while   (
                    !precision_for_times_is_good
                        (
                            time_L,
                            time_R
                        )
                )
        {
            double  time_third  =   ( time_R    -   time_L ) / 3;
            double  time_L_new  =   time_L      +   time_third;
            double  time_R_new  =   time_R      -   time_third;
 
            if  (
                        group_len_for_time( time_L_new )
                    >   group_len_for_time( time_R_new )
                )
            {
                time_L  =   time_L_new;
            }
            else
            {
                time_R  =   time_R_new;
            }
        }//while
 
        time_of_group_len_min_  =   time_L;
        group_len_min_          =   group_len_for_time( time_L );
    }
    //-----------------------------------------------------------------------------------
    bool    precision_for_times_is_good
        (
            double  val_A,
            double  val_B
        )
    {
        double  val_min     =   val_A;
        double  val_max     =   val_B;
 
        if( val_min     >   val_max )
        {
            std::swap( val_min, val_max );
        }
 
        return                  ( val_max   -   val_min         )
                /   std::max    ( 1.0,          abs( val_min )  )   <=  precision_ / v_max_;
    }
    //-----------------------------------------------------------------------------------
    struct  T_count_min_and_max_x_for_time
    {
        //-------------------------------------------------------------------------------
        double  time_;
        double  x_min_;
        double  x_max_;
        bool    is_first_iteration_;
        //-------------------------------------------------------------------------------
        T_count_min_and_max_x_for_time( double  time )
            :
            time_                   ( time ),
            x_min_                  (),
            x_max_                  (),
            is_first_iteration_     ( true )
        {}
        //-------------------------------------------------------------------------------
        void    operator()  ( T_cyclist     const   &   cyclist )
        {
            auto    x_cur   =   cyclist.get_x_for_time( time_ );
 
            if( is_first_iteration_ )
            {
                x_min_  =   x_max_      =   x_cur;
                is_first_iteration_     =   false;
            }
            else
            {
                if( x_cur   <   x_min_ )
                {
                    x_min_  =   x_cur;
                }
 
                if( x_cur   >   x_max_ )
                {
                    x_max_  =   x_cur;
                }//if
            }
        }
        //-------------------------------------------------------------------------------
        operator    double()
        {
            return  x_max_ - x_min_;
        }
        //-------------------------------------------------------------------------------
    };
    //-----------------------------------------------------------------------------------
    double  group_len_for_time( double     time )                                   const
    {
        return  std::for_each
                    (
                        cyclists_.begin                 (),
                        cyclists_.end                   (),
                        T_count_min_and_max_x_for_time  ( time )
                    );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    std::cout   <<  "N = ";
    int     n   =   0;
    std::cin    >>  n;
 
    T_cyclists  cyclists;
    int         v_max   =   0;
 
    for( int  i = 0; i < n; ++i )
    {
        T_cyclist   cur_cyclist;
 
        std::cout   <<  std::endl
                    <<  "x"
                    <<  i + 1
                    <<  " = ";
 
        std::cin    >>  cur_cyclist.x_;
 
        std::cout   <<  "v"
                    <<  i + 1
                    <<  " = ";
 
        std::cin    >>  cur_cyclist.v_;
        v_max   =   std::max( v_max, cur_cyclist.v_ );
        cyclists.insert( cur_cyclist );
    }//for
 
    std::cout   <<  std::endl
                <<  "Допустимая погрешность вычислений: ";
    double  precision   =   0;
    std::cin    >>  precision;
 
    T_race  race    (
                        cyclists,
                        v_max,
                        precision
                    );
 
    std::cout   <<  std::endl
                <<  "time\t\t=\t"
                <<  race.time_of_group_len_min()
                <<  std::endl
                <<  "group_len_min\t=\t"
                <<  race.group_len_min()
                <<  std::endl;
 
    system("pause");
}
1
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
29.04.2015, 21:06 15
Kronos0041, если скорость у первого 10 км/ч то расстояние между первым и последним будет увеличиваться с каждым шагом и никогда не станет меньше изначального это означает что фоткать надо вот прямо сейчас
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.04.2015, 18:19 16
Мою программу еще можно ускорить. В ней из каждой группы велосипедистов с одинаковыми стартовым расстоянием и скоростью берется только один.
В этой программе из каждой группы велосипедистов с одинаковой скоростью, но разными стартовыми расстояниями берутся только два – лидер и замыкающий, так как промежуточные на результат не влияют.
Т.е. если у нас стартуют миллиард велосипедистов с одинаковыми скоростью и расстоянием, то из них берется только один. Если стартует миллиард велосипедистов с одинаковой скоростью, но разными расстояниями, то из них берутся только два.
Итого из двух миллиардов велосипедистов для расчетов берем только троих.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/////////////////////////////////////////////////////////////////////////////////////////
//Велосипедисты, участвующие в шоссейной гонке, в некоторый момент времени, который
//называется начальным, оказались в точках, удаленных от места старта на x1, x2, …, xn метров (n –
//общее количество велосипедистов). Каждый велосипедист двигается со своей постоянной
//скоростью v1, v2, …, vn метров в секунду. Все велосипедисты двигаются в одну и ту же сторону.
//Репортер, освещающий ход соревнований, хочет определить момент времени, в который
//расстояние между лидирующим в гонке велосипедистом и замыкающим гонку велосипедистом
//станет минимальным, чтобы с вертолета сфотографировать сразу всех участников велогонки.
//
//Требуется написать программу, которая по заданному количеству велосипедистов n, заданным
//начальным положениям велосипедистов x1, x2, …, xn и их скоростям v1, v2, …, vn, вычислит момент
//времени*t, в который расстояние l между лидирующим и замыкающим велосипедистом будет
//минимальным.
//
//ВВОД.
//Первая строка содержит целое число n – количество велосипедистов. В следующих n
//строках указаны по два целых числа: xi – расстояние от старта до i-го велосипедиста и vi – его
//скорость (0 ≤ xi, vi ≤ 107).
//
//ВЫВОД.
//В выходной файл необходимо вывести два вещественных числа: t – время в секундах,
//прошедшее от начального момента времени до момента, когда расстояние в метрах между
//лидером и замыкающим будет минимальным, l – искомое расстояние. Числа t и l должны иметь
//абсолютную или относительную погрешность не более 10-6, что означает следующее. Пусть
//выведенное число равно x, а в правильном ответе оно равно y. Ответ будет считаться правильным,
//если значение выражения |x – y| / max{1, |y|} не превышает 10-6.
//
//3            5
//
//0 40       90 100
//
//30 10      100 70
//
//40 30      100 70
//
//           110 60
//
//           120 35 
//
//Вывод 1    Вывод 2
//
//1 30          0.5 5.000000000000
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <limits>
#include <map>
#include <set>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                     T_str;
typedef double                          T_v;
typedef double                          T_x;
typedef std::set< T_x               >   T_x_values;
typedef std::map< T_v,  T_x_values  >   T_x_values_of_v;
/////////////////////////////////////////////////////////////////////////////////////////
class   T_race
{
    //-----------------------------------------------------------------------------------
    T_x_values_of_v     x_values_of_v_;
    double              precision_;
    double              group_len_min_;
    double              time_of_group_len_min_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    T_race  (
                T_x_values_of_v     const   &   x_values_of_v,
                double                          precision
            )
        :
        x_values_of_v_          ( x_values_of_v ),
        precision_              ( precision     ),
        group_len_min_          (),
        time_of_group_len_min_  ()
    {
        count_group_len_min_and_time();
    }
    //-----------------------------------------------------------------------------------
    double  time_of_group_len_min()                                                 const
    {
        return  time_of_group_len_min_;
    }
    //-----------------------------------------------------------------------------------
    double  group_len_min()                                                         const
    {
        return  group_len_min_;
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    void    count_group_len_min_and_time()
    {
        double  time_L  =   0;
        double  time_R  =   1;
 
        while   (
                        group_len_for_time( time_L )
                    >   group_len_for_time( time_R )
                )
        {
            time_R  *=  2;
        }
 
        find_min_group_len_in_time_segment
            (
                time_L,
                time_R
            );
    }
    //-----------------------------------------------------------------------------------
    void    find_min_group_len_in_time_segment
        (
            double  time_L,
            double  time_R
        )
    {
        while   (
                    !precision_for_times_is_good
                        (
                            time_L,
                            time_R
                        )
                )
        {
            double  time_third  =   ( time_R    -   time_L ) / 3;
            double  time_L_new  =   time_L      +   time_third;
            double  time_R_new  =   time_R      -   time_third;
 
            if  (
                        group_len_for_time( time_L_new )
                    >   group_len_for_time( time_R_new )
                )
            {
                time_L  =   time_L_new;
            }
            else
            {
                time_R  =   time_R_new;
            }
        }//while
 
        time_of_group_len_min_  =   time_L;
        group_len_min_          =   group_len_for_time( time_L );
    }
    //-----------------------------------------------------------------------------------
    bool    precision_for_times_is_good
        (
            double  time_A,
            double  time_B
        )                                                                           const
    {
        double  time_min    =   time_A;
        double  time_max    =   time_B;
 
        if( time_min    >   time_max )
        {
            std::swap( time_min, time_max );
        }
 
        return                      ( time_max  -   time_min            )
                    /   std::max    ( 1.0,          abs( time_min )     )
 
                <=  precision_ / x_values_of_v_.rbegin()->first;
    }
    //-----------------------------------------------------------------------------------
    struct  T_count_min_and_max_x_for_time
    {
        //-------------------------------------------------------------------------------
        double  time_;
        double  x_min_;
        double  x_max_;
        //-------------------------------------------------------------------------------
        T_count_min_and_max_x_for_time( double  time )
            :
            time_                   ( time ),
            x_min_                  ( std::numeric_limits<double>::max()    ),
            x_max_                  ()
        {}
        //-------------------------------------------------------------------------------
        void    operator()  ( T_x_values_of_v::value_type  const   &   v_and_x_values )
        {
            auto    &   v           =   v_and_x_values.first;
            auto    &   x_values    =   v_and_x_values.second;
 
            std::for_each
                (
                    x_values.begin  (),
                    x_values.end    (),
 
                    [=]             ( double    x )
                    {
                        auto    x_cur   =   x + v * time_;
 
                        if( x_cur   <   x_min_ )
                        {
                            x_min_  =   x_cur;
                        }
 
                        if( x_cur   >   x_max_ )
                        {
                            x_max_  =   x_cur;
                        }//if
                    }//lambda
                );//for_each
        }
        //-------------------------------------------------------------------------------
        operator    double()                                                        const
        {
            return  x_max_ - x_min_;
        }
        //-------------------------------------------------------------------------------
    };
    //-----------------------------------------------------------------------------------
    double  group_len_for_time( double     time )                                   const
    {
        return  std::for_each
                    (
                        x_values_of_v_.begin            (),
                        x_values_of_v_.end              (),
                        T_count_min_and_max_x_for_time  ( time )
                    );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
void    input_val_with_ind_and_name
    (
        double          &   val,
        int                 ind,
        T_str   const   &   name
    )
{
    std::cout   <<  name
                <<  ind + 1
                <<  " = ";
 
    std::cin    >>  val;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    std::cout   <<  "N = ";
    int     n   =   0;
    std::cin    >>  n;
 
    T_x_values_of_v    x_values_of_v;
 
    for( int  i = 0; i < n; ++i )
    {
        std::cout   <<  std::endl;
 
        T_x     x   =   0;
        input_val_with_ind_and_name
            (
                x,
                i,
                "x"
            );
 
        T_v     v   =   0;
        input_val_with_ind_and_name
            (
                v,
                i,
                "v"
            );
 
        auto    &   x_values_cur   =   x_values_of_v[v];
 
        if  (
                x_values_cur.size()    >=  2
            )
        {
            if  (
                    x   <   *x_values_cur.begin()
                )
            {
                x_values_cur.erase( x_values_cur.begin() );
            }
 
            if  (
                    x   >   *x_values_cur.rbegin()
                )
            {
                x_values_cur.erase( --x_values_cur.end() );
            }
        }//if
 
        x_values_cur.insert(x);
    }//for
 
    std::cout   <<  std::endl
                <<  "Допустимая погрешность вычислений: ";
    double  precision   =   0;
    std::cin    >>  precision;
 
    T_race  race    (
                        x_values_of_v,
                        precision
                    );
 
    std::cout   <<  std::endl
                <<  "time\t\t=\t"
                <<  race.time_of_group_len_min()
                <<  std::endl
                <<  "group_len_min\t=\t"
                <<  race.group_len_min()
                <<  std::endl;
 
    system("pause");
}
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
30.04.2015, 18:26 17
Цитата Сообщение от Mr.X Посмотреть сообщение
В ней из каждой группы велосипедистов с одинаковыми стартовым расстоянием и скоростью берется только один.
Цитата Сообщение от Mr.X Посмотреть сообщение
В этой программе из каждой группы велосипедистов с одинаковой скоростью, но разными стартовыми расстояниями
задача основана на том что у каждого персональные хар-ки,а при условиях выше фотограф может делать фото в любой момент времени т.к. колонна будет всегда одинакового размера
0
2 / 2 / 1
Регистрация: 18.03.2014
Сообщений: 147
30.04.2015, 18:38  [ТС] 18
Цитата Сообщение от Iridiscent Посмотреть сообщение
сам посоветовал сам сделал -_-
Велогонка - ошибка на тесте
2
1 2
2 1
Правильный ответ
1.00000000000000000000 0.00000000000000000000
А у тебя
0.5 0.000000
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.04.2015, 18:54 19
Цитата Сообщение от Iridiscent Посмотреть сообщение
задача основана на том что у каждого персональные хар-ки
Не выдумывайте, там в примере как раз даются два велосипедиста с совпадающими характеристиками.
Цитата Сообщение от Iridiscent Посмотреть сообщение
при условиях выше фотограф может делать фото в любой момент времени т.к. колонна будет всегда одинакового размера
Ну дак может быть несколько колонн, каждая из которых двигается со своей скоростью. Из каждой колонны достаточно взять только концевых.
1
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
30.04.2015, 19:44 20
когда переделывал с int на float забыл поменять тип функции получения x на float
вот рабочая версия
Кликните здесь для просмотра всего текста
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
////////////////////////////////////////////////////////////////////////////////////////////////
/**< Велосипедисты, участвующие в шоссейной гонке, в некоторый момент времени, который
называется начальным, оказались в точках, удаленных от места старта на x1, x2, …, xn метров (n –
общее количество велосипедистов). Каждый велосипедист двигается со своей постоянной
скоростью v1, v2, …, vn метров в секунду. Все велосипедисты двигаются в одну и ту же сторону.
Репортер, освещающий ход соревнований, хочет определить момент времени, в который
расстояние между лидирующим в гонке велосипедистом и замыкающим гонку велосипедистом
станет минимальным, чтобы с вертолета сфотографировать сразу всех участников велогонки.
 
Требуется написать программу, которая по заданному количеству велосипедистов n, заданным
начальным положениям велосипедистов x1, x2, …, xn и их скоростям v1, v2, …, vn, вычислит момент
времени*t, в который расстояние l между лидирующим и замыкающим велосипедистом будет
минимальным.
 
Ввод. Первая строка содержит целое число n**– количество велосипедистов. В следующих n
строках указаны по два целых числа: xi – расстояние от старта до i-го велосипедиста и vi – его
скорость (0*≤*xi, vi*≤*107).
 
Вывод. В выходной файл необходимо вывести два вещественных числа: t – время в секундах,
прошедшее от начального момента времени до момента, когда расстояние в метрах между
лидером и замыкающим будет минимальным, l – искомое расстояние. Числа t и l должны иметь
абсолютную или относительную погрешность не более 10-6, что означает следующее. Пусть
выведенное число равно x, а в правильном ответе оно равно y. Ответ будет считаться правильным,
если значение выражения |x*–*y|* /*max{1,*|y|} не*превышает 10-6. **/
////////////////////////////////////////////////////////////////////////////////////////////
#include <locale>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <conio.h>
#include <ctime>
#include <iomanip>
using namespace std;
 
float t=0,tz=0.0; const int n=2;
class vell
{
    float x,v;
 
public:
    vell(float x1,float v1)
    {
        x=x1;v=v1;
    }
 void shag(float sh)
    {
        x+=(v*sh);
 
    }
float getx()
 {
     return x;
 }
float getv()
{
    return v;
}
 
};
vell player[n]=
{
    vell(1.0,2.0),
    vell(2.0,1.0)
    //vell(40,30),
    //vell(100,70),
    //vell(110,60),
    //vell(120,35)
};
vell maxp=vell(0,0);
vell minp=vell(0,0);
void allshag(float i);
 
 
int main() //основная функция
{
 
int a,b1;
float shag, result=999.0,n1,b;
 
 
cout<<endl<<"введите размер шага: ";
cin>>shag;
cout<<endl<<"введите число шагов: ";
cin>>n1;
float limit=n1*shag;
 
for(b=0;b<=limit;b+=shag)
{
maxp=minp=player[0];
for(a=0;a<n;a++)
{
 
 
    if ( player[a].getx()>maxp.getx() )  maxp=player[a];//отбор певого
    if ( player[a].getx()<minp.getx() )   minp=player[a];//отбор втоого
 
}
 
 
    if((maxp.getx()- minp.getx())<result)
    {
 
tz=t;
     result=(maxp.getx()- minp.getx());
 
    }
 
 
allshag(shag);
 
}
cout<<endl<<"время ";
cout<<fixed<<setprecision(1)<<tz;
cout<<endl<<"расстояние ";
cout<<fixed<<setprecision(1)<<result;
 
 
 
}
void allshag(float i)
{
 
t+=i;
int a;
for(a=0;a<n;a++)
  player[a].shag(i);
 
 
}


Добавлено через 2 минуты
Mr.X, извиняюсь думал вы говорите про всю группу велосипедистов сразу
0
30.04.2015, 19:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2015, 19:44
Помогаю со студенческими работами здесь

Расстояние между максимальным и минимальным значениями функции
Значение функции f(x)=4x3-3x2+2x-1 определены в точках x=X0(hx)Xn. ( Х0 - начальное, hx - шаг, Xn -...

Момент времени, когда два тела будут находиться на одинаковой высоте
Помогите девушке! Первое тело брошено вертикально вверх. Модуль начальной скорости υ0 =...

Определите модуль абсолютного ускорения точки M в момент времени, когда координата S = 0
Точка M маятника движется по окружности радиуса r = 0.3 м согласно уравнению S = 0.03·sin( 0.6·t)...

Определить расстояние между максимальным и минимальным значениями функции
Помогите составить программу плиз!!! f(x)=4*x^3-3*x^2+2*x-1 определены в точках x=x0(hx)xn.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru