Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102

Задача про водопровод

25.12.2011, 22:05. Показов 4439. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Город Восточный постоянно страдает от недостатка воды. Для устранения этой проблемы была построена новая водопроводная труба. Строительство трубы началось с обоих концов одновременно, и спустя некоторое время половины соединились. Ну, почти. Первая половина трубы заканчивалась в точке (x1, y1), а вторая - в точке (x2, y2).

К сожалению, осталось лишь несколько отрезков трубы различной длины. Более того, из-за специфики местной технологии трубы могут быть проложены только в направлении с севера на юг или с востока на запад и соединяются, образуя или прямую, или угол 90 градусов. Требуется, зная длины отрезков труб L1, L2, ..., LK и количество отрезков каждой длины C1, C2, ..., CK, сконструировать трубу, соединяющую две заданные точки, или определить, что это невозможно.

Ограничения: 1 <= K <= 4, 1 <= x1, y1, x2, y2, Li <= 1000, 1 <= Ci <= 10, все числа целые, время 3 с.
Ввод из файла wpipe.in. В первой строке находятся числа x1, y1, x2, y2, K, затем 2K чисел: L1, L2, ..., LK, C1, C2, ..., CK.
Вывод в файл wpipe.out. Вывести одно число - минимальное количество нужных отрезков труб или -1, если соединение невозможно.
Примеры
Ввод 1 Ввод 2
5 5 5 6 1 2 10 20 10 60 50 2 70 30 2 2
Вывод 1 Вывод 2
-1 4
моя попытка решить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
using namespace std;
void main()
{ifstream wpipein; ofstream wpipeout;
int c[4],l[4]; int x1,y1,x2,y2,i,j,s=0,t=0,m;
int k;
wpipein.open("wpipein.txt"); wpipeout.open("wpipeout.txt");
wpipein>>x1>>y1>>x2>>y2>>k;
for (i=0; i<k; i++)
wpipein>>c[i]>>l[i];
for (i=0;i<k; i++)
for (j=0;j<k;j++)
{if ((abs(x1-x2)==s+c[i]*l[i])&&(abs(y1-y2)==t+c[j]*l[j])&&(c[k]>=c[i]+c[j]))
{s=c[i]*l[i]; t=c[j]*l[j];
if ((abs(x1-x2)%l[k]==0)&&(abs(y1-y2)%l[k]==0))
{m=abs(x1-x2)/l[k]+abs(y1-y2)/l[k];
if (m<=c[k]) wpipeout<<m; else wpipeout<<-1;
}}}}
скажите я вообще правильно рассуждаю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2011, 22:05
Ответы с готовыми решениями:

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

Задача про дату!
Три файла: 1.date.cpp 2.date.h (заголовочный) 3.main.cpp Ну собственно в main.cpp, cout месяц не тот выводит.... И если в assert...

Задача про Лестницу
Условия формулируются так: Есть лестница высотой в n ступенек (плюс «нулевая» - площадка, где мы стоим вначале). На каждой ступеньке...

22
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
28.12.2011, 20:43  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от valeriikozlov Посмотреть сообщение
ладно, все понятно, вот комментарии:
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
void rec(int sum, int fl, int pred, int col)// sum - сумма уже набранной длины (для первого или для второго отрезка), 
//fl==0 если набираем длину для первого отрезка, fl==1 если набираем длину для второго отрезка
// индекс труб, которые перебираем на данном вызове rec()
// col - количество труб, которые уже использовали для достижения текущего значения
{
        
        if(fl==1)// если набираем вторую длину
        {
                if(sum==y1)// если вторую длину набрали
                {
                        if(res==-1)// если результата еще не было
                                res=col;// то результат равен col
                        else// если результат уже был
                        {
                                if(res>col)// если полученное значение меньше записанного результата
                                        res=col;// то результат равен этому значению
                        }
                        return;// возврат из функции
                }
                if(pred==k)// если достигли конца массива струбами
                        return;// возврат из функции
                int i;
                for(i=0; i<=c[pred]; i++)// перебираем трубы с текущим индексом (pred)
                {
 
                        rec(sum+i*l[pred], fl, pred+1, col+i);// то прибавляем их длину
                                                if(i!=0)
                                                        rec(sum-i*l[pred], fl, pred+1, col+i);// то убавляем их длину
                }
        }
        else// если набираем первую длину
        {
                if(sum==x1)// если первую длину набрали
                {
                        rec(0, 1, 0, col);// начинаем набирать вторую длину
                }
                else
                {
                        if(pred==k)// если достигли конца массива струбами
                                return;// возврат из функции
                        int i, tmp=c[pred];
                        for(i=0; i<=tmp; i++)// перебираем трубы с текущим индексом (pred)
                        {
                                c[pred]=tmp-i;// убавляем значение задействованных труб
                                rec(sum+i*l[pred], fl, pred+1, col+i);// то прибавляем их длину
                                                                if(i!=0)
                                                                        rec(sum-i*l[pred], fl, pred+1, col+i);/ то убавляем их длину
                                c[pred]=tmp;// в конце восстанавливаем значение
                        }
                }
        }
 
}
спасибо
могли бы вы пояснить последний момент по поводу return; как пояснить смысл этого оператора? боюсь меня могут спросить об этом, ведь нам не показывали что можно в процедуре использовать данный оператор

Добавлено через 34 минуты
и еще вопрос pred - это индекс труб которые уже использовали для достижения текущего значения
тогда fl - переменная определяющая какую трубу мы набираем в данный момент
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
29.12.2011, 05:50
Цитата Сообщение от crewww Посмотреть сообщение
могли бы вы пояснить последний момент по поводу return; как пояснить смысл этого оператора?
этот оператор не дает выполняться остальному коду в функции, и возвращает нас в точку, откуда функция была вызвана.

Цитата Сообщение от crewww Посмотреть сообщение
и еще вопрос pred - это индекс труб которые уже использовали для достижения текущего значения
тогда fl - переменная определяющая какую трубу мы набираем в данный момент
pred - это индекс труб которые сейчас используем для достижения текущего значения
Да, fl - переменная определяющая какую трубу мы набираем в данный момент
1
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
29.12.2011, 06:15  [ТС]
огромное спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2011, 06:15

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

Задача про зайца
В небольшой посадке живет заяц. Выскочив из норы и бегая по снегу, он оставил следы. Определить где находится заяц. ВХОДНЫЕ ДАНЫЕ Карта...

Задача про ракету
Нужно решить задачу,написав код на с++. Ракета массой 300 т стартует с Земли. Через какое время она достигнет высоты 40 км, если за...

задача про массивы
упорядочить по убыванию положительные эл-ты массмва, сохраняя остальные эл-ты на прежних местах

Задача про пассажиров
На олимпиаду приехало N человек. Для их перевозки выделили автобусы двух видов: вместимостью K и M пассажиров (не считая водителя). К...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru