Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2014, 17:22   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Помогите разобраться с алгоритмом: определить по мишени результаты соревнований по стрельбе

Надо написать программу на Си,но я что-то вообще не знаю даже с чего начать в этом задании((
Вот мое решение
Я насчитала 188 очков на мишени, а это число на 3 не делится ровно.
1 стрелок - 1+2+3+5+10+50
2 стрелок - 25+20+20+3+2+1
3 стрелок - 20+10+10+5+1+25
Один из стрелков попал в отметку "25" другого стрелка )
Изображения
Тип файла: jpg та.JPG (35.0 Кб, 47 просмотров)
Вероника99 вне форума Ответить с цитированием
Старый 07.01.2014, 18:15   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Вероника99 Посмотреть сообщение
Один из стрелков попал в отметку "25" другого стрелка )
Откуда Вы это знаете?! Я не увидел этого утверждения в условиях задачи.
может быть, в единицу дважды попали?!

А алгоритм, имхо, чисто переборный. у нас есть 8 выстрелов ниже средней линии (кроме 50). Нужно взять все варианты 5 из 8.
и проверить, можно ли из оставшихся чисел суммированием получить равное число очков.


p.s. а как Вы получили результат? Он очень похож на правильный!

Последний раз редактировалось Serge_Bliznykov; 07.01.2014 в 18:19.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.01.2014, 18:29   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Сфера фантастики. Кто Вам такие задачки задаёт? Наверное уроды, которые никогда на стрельбах не бывали. Или террористы, готовящие шахидок (уродство в высшей сфере своего проявлния!). Ни один, уважающий себя стрелок, не будет стрелять, в уже расстрелянную мишень. В общем, мир - свихнулся окончательно!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.01.2014, 18:40   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

На прологе такие задачи решать удобно. Тем же подходом и на Си можно решить, но неудобно: http://pro-prof.com/archives/1299 (см. "задачи на установление соответствия" - тебе надо установить соответствие между стрелками и выстрелами). На плюсах еще, наверное, можно использовать тот же подход, что и в известной задаче о размене валюты.
rrrFer вне форума Ответить с цитированием
Старый 07.01.2014, 19:59   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

17 выстрелов, на три не делится, хоть об стену головой. Кто-то смухлевал или выстрелил в воздух. Короче, задача решения не имеет.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.01.2014, 20:21   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
check(L):- not(member(50, L)), !; maplist(p, L).
p(Val):- Val < 20; Val = 50.

pp(L1, L2, L3):-
	%L1 = [X1, _, _, _, _, _], member(X1, [1,2,3,5,10,20,25,50]), 
	L1 = [_, _, _, _, _, _],
	L2 = [_, _, _, _, _, _], L3 = [_, _, _, _, _, _], Sum = 71,!, 
	
	L1 = [25|LL1],
	permutation([50,20,20,3,2,25,1,5,20,10,10,10,3,5,1,2,1], Per1), 

	append(LL1, Per2, Per1), sumlist(L1, Sum),  
	append(L2, L3, Per2), sumlist(L2, Sum), sumlist(L3, Sum), 

	check(L1), check(L2), check(L3).
Но это решение наверное нет смысла переводить на плюсы
Если нельзя вывести что в 25 попали дважды - то сумма не 71, и программа будет работать дольше. Если список в permutation как-то переупорядочить неудачно - то программа доже может работать долго, вроде бы. Тут машина пролога перемешивает список и разделяет его на 3 части, но она не учитывает что если переставить местами элементы списка [10, 10] то получится тот же список (вобщем количество проверок можно сильно сократить, но надо думать). Тут тупое решение.

Цитата:
вообще не знаю даже с чего начать в этом задании((
начать надо с генерации перестановок. На самом деле, их не так много.
Тебе надо заполнить 2 списка (сгенерировать 12 элементов из заданного набора), третий набор получится сам.

Генерировать надо без перестановок - тогда получится менее 262 144 (это очень верхняя оценка) вариантов.
Если генерировать с перестановками (как делает permutation пролога) - получится меньше 11 019 960 576 вариантов (это тоже верхняя оценка).
Разница очевидна.

А в коде выше генерируются не 2, а все 3 списка, кроме того.

Последний раз редактировалось Stilet; 07.01.2014 в 22:18.
rrrFer вне форума Ответить с цитированием
Старый 07.01.2014, 21:21   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Приняли участие три стелка. Каждый зделал по шесть выстрелов. Один, попал в пулю другого (25).
3 * 6 = 21. На мишени 17-ть попаданий. Где ещё 21-17+1 = 3 попадания?
Какая рограмма? Задача не решена в условиях! Обалдели что-ли?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.01.2014, 21:21   #8
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
17 выстрелов, на три не делится, хоть об стену головой. Кто-то смухлевал или выстрелил в воздух. Короче, задача решения не имеет.
Да,я тоже на этом застряла, может быть все таки ошибка в условии
Вероника99 вне форума Ответить с цитированием
Старый 07.01.2014, 21:33   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Smitt&Wesson, 3 * 6 = 18, так что найти нужно только 1 выстрел.
Он мог промахнуться или попасть в одно из попаданий:
не подходят: 188 (+0), 190 (+2), 191 (+3), 193 (+5), 208 (+20), 238 (+50)
подходят: 189 (+1), 198 (+10), 213 (+25)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.01.2014 в 21:38.
BDA вне форума Ответить с цитированием
Старый 07.01.2014, 21:39   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Smitt&Wesson, 3 * 6 = 18, так что найти нужно только 1 выстрел.
хм, достал калькулятор, посчитал по твоей формуле, все сходится.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Результаты соревнований по прыжкам в длину представлены в виде матрицы 5х3 (5 спортсменов по 3 попытки ) inKognit Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 13.01.2011 16:39
[Perl] плагин для проверки количества процессов для Nagios st01en Perl 3 27.10.2010 14:37
Помогите разобраться с алгоритмом!!!! kreviuz Помощь студентам 2 22.10.2009 02:09
Помогите разобраться с алгоритмом программы Evgenii Помощь студентам 10 07.11.2008 16:07
Перенос слов по слогам (не могу разобраться с алгоритмом) Only Love Помощь студентам 1 21.05.2007 22:43