Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача про студентов. 
:(
    Опции темы
Vermaxt
Дата 8.3.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Доброе время суток. При подготовке к олимпиаде столкнулся со следующей задачей:

Группа студентов является членами клуба, который ежегодно путешествует в различные места. Группа заранее договорилась делить расходы поровну, но не удобно делить расходы по мере поступления. Поэтому каждый студент в отдельности платит за определенные вещи. После путешествия расходы суммируются, и происходит обмен деньгами так, что итоговая стоимость для всех оказывается равной с точностью до одного цента. Требуется найти то количество денег которое должно поменять хозяина для того чтобы расходы уравнялись с точностью до одного цента.
Пример входных данных
4
15.00
15.01
3.00
3.01

первая строка - кол-во студентов
Последующие строки - расход отдельного студента.

Привожу свой код решения
Код

program ex10137;

var
   studNum, i: integer;
   pays : array [1..1000] of double;
   sum, foreach : double;
begin
   readln(studNum);

   while (studNum > 0) do
   begin
      sum := 0.0;

      for i := 1 to studNum do
         begin
            readln(pays[i]);
            sum := sum + pays[i];
         end;

      foreach := sum / studNum;

      sum := 0.0;

      for i:= 1 to studNum do
         if pays[i] < foreach then
            sum := sum + foreach - pays[i];

      writeln('$',sum:0:2);

      readln(studNum);
   end;
end.


Если использовать данные которые я привел в примере входных данных то получается (в программе) 12.00
Но на самом деле ответ 11.99. Я понимаю что вся неточность начинается после вычисления среднего арифметического 9.005 - пол цента. Подскажите как исправить алгаритм?


Это сообщение отредактировал(а) Vermaxt - 8.3.2010, 15:47
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(Vermaxt @  8.3.2010,  13:59 Найти цитируемый пост)
Привожу свой код решения

это какой-то новый способ подсчета среднего арифметического? smile 

Паскаль я подзабыл, так что извиняйте, пишу на C++
Код

#include <iostream>

int main()
{
    int num;
    double sum = 0;
    double tmp = 0;

    std::cin >> num;

    for (int i = 0; i < num; ++i)
    {
        std::cin >> tmp;
        sum += tmp;
    }

    std::cout << sum / num << std::endl;
}


PM   Вверх
Vermaxt
Дата 8.3.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Цитата

это какой-то новый способ подсчета среднего арифметического? 

Не понял ваше замечание.
Код

   readln(pays[i]); {Заносим в ячейку массива затраты очередного студента для дальнейшего использования}
   sum := sum + pays[i]; {и заодно находим сколько они потратили вместе}

   foreach := sum / studNum; {Находим среднее арифметическое}



Это сообщение отредактировал(а) Vermaxt - 8.3.2010, 14:36
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(Vermaxt @  8.3.2010,  14:36 Найти цитируемый пост)
{Заносим в ячейку массива затраты очередного студента для дальнейшего использования}

а зачем нужен этот массив, хранящий затраты очередного студента? Нужна только сумма.
PM   Вверх
Vermaxt
Дата 8.3.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Цитата

После путешествия расходы суммируются, и происходит обмен деньгами так, что итоговая стоимость для всех оказывается равной с точностью до одного цента.

А как вы решите проблему задачи без знания того сколько потратил каждый студент?
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(Vermaxt @  8.3.2010,  15:15 Найти цитируемый пост)
А как вы решите проблему задачи без знания того сколько потратил каждый студент? 

а вы посмотрите, я же ее решил.

извиняюсь, это решение первой части задания, не заметил, что надо считать количество возвращаемой суммы.
сейчас исправлю

Это сообщение отредактировал(а) azesmcar - 8.3.2010, 15:19
PM   Вверх
Vermaxt
Дата 8.3.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



azesmcar, Да, наверное это я не достаточно ясно описал условия. Требуется найти то количество денег которые должны поменять хозяина для того чтобы у всех стало поровну денег. А не вычислить то сколько должен потратить каждый.
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Vermaxt

А почему вы решили что правильный ответ не 12?
Один заплатил больше на 6.005 а другой на 5.995, в итоге 12, все честно.

Это сообщение отредактировал(а) azesmcar - 8.3.2010, 19:45
PM   Вверх
Vermaxt
Дата 8.3.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



azesmcar, Поверьте люди в Univeersidad de Valladolid не ошибаются.
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(Vermaxt @  8.3.2010,  15:46 Найти цитируемый пост)
azesmcar, Поверьте люди в Univeersidad de Valladolid не ошибаются. 

Я никому не верю, и уж тем более организациям с непроизносимым названием smile 

Я хочу понять, с чего вдруг ответ должен быть 11.99, вы можете это объяснить?

Студенты заплатили
15
15,01
3
3,01

в сумме они потратили 36.02 вчетвером, т.е. по честному каждый из них должен был потратить 9.005.
1-ые два студента потратили больше, вторые два - меньше
Цитата

15->5.995
15.01->6.005
3->-6.005
3.01->-5.995

вторым двум надо вернуть первым двум в сумме 12. Где ошибка в логике?
PM   Вверх
Vermaxt
Дата 8.3.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



azesmcar, А теперь вопрос как каждый из двух первых студентов отдаст по пол цента? Разве существует такая монета? Если они "договорятся" мол отдай за меня пол цента я тебе потом куплю жвачку то ладно. Собственно что я хочу сказать равенство нарушится если один из студентов доплатит пол цента за другого. 
PM MAIL   Вверх
azesmcar
Дата 8.3.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Vermaxt

Логика проста, каждый должен был заплатить 9,005 (т.е. 9$ и пол цента), это среднее арифметическое, тут ошибок быть не может, в задании нигде не сказано, что пол цента передавать нельзя, и к тому же вы не должны решать чужие проблемы, вам надо выяснить число - вы выяснили, по честному будет 9,005, как они будут эти деньги делить - проблема не ваша. smile Если они не отдадут пол цента - нарушится условие задачи.

Это сообщение отредактировал(а) azesmcar - 8.3.2010, 16:51
PM   Вверх
Vermaxt
Дата 8.3.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Господа, и все же тема остается открытой. У кого есть какие мысли высказываем!
PM MAIL   Вверх
kemiisto
Дата 8.3.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Цитата(Vermaxt @  8.3.2010,  20:23 Найти цитируемый пост)
Господа, и все же тема остается открытой. У кого есть какие мысли высказываем! 

Господа усе в Вальядолиде. smile 

Как вариант - округлять полученное среднее арифметическое до целого или до числа с плавающей точкой но только с 2-мя знаками после запятой.

До целого так:
Код
foreach := round(sum / studNum);
 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
azesmcar
Дата 8.3.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(kemiisto @  8.3.2010,  19:44 Найти цитируемый пост)
Как вариант - округлять полученное среднее арифметическое до целого или до числа с плавающей точкой но только с 2-мя знаками после запятой.

если округлить - 4 * округленное среднее арифметическое в итоге выйдет больше/меньше чем они потратили smile 
Куда же девать лишний цент? Предлагаю пустить на благотворительность... ну или пусть перечисляют мне, с каждого запуска программы по центу - я быстро разбогатею smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.