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

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

25.12.2011, 22:05. Показов 4282. Ответов 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
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru