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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2010, 23:40   #1
Lusy
Новичок
Джуниор
 
Аватар для Lusy
 
Регистрация: 10.11.2010
Сообщений: 4
Восклицание Паскаль. Задача о гирях (оо").

Два игрока имеют гири на чашах весов. Гири первого игрока (N штук) стоят на первой чаше, а второго (M штук) - на второй.
Гири отличаются весом, для каждой гири задан свой вес. Двух гирь с одинаковым весом нет. В начальный момент суммарный вес гирь больше. Тот, кто ходит первый, убирает по одной гире со своей чаши, пока вес его гирь не станет меньше веса гирь противника. После этого ход переходит к противнику. Выигрывает тот, кто первым уберет все гири. Требуется определить, кто из них выиграет при оптимальной стратегии обоих игроковю

Входные данные: В первой строке входного файла содержатся два числа (через пробел) - N и M 0<N<=50000, 0<M<=50000. В последующих N+M строках расположены целые положительные числа а[i] (0<a[i]<=1000000, 1<=i<=N+M),веса гирь сначала первого, а затем второго игроков.

Выходные данные: в выходном файле должны отображаться последовательности убираемых гирь через пробел (каждая последовательность на новой строке), в последней строке номер выигравшего. (1 или 2).





Оптимальной стратегией будет "убирание гирь с минимальным весом". Как то так. Могу кинуть свой вариант решения, но как сказала учительница - оч долгий он у меня. Можно решить быстрее через подпрограмму процедуру.


Очень надо сделать!... Завтра сдавать...

Последний раз редактировалось Lusy; 10.11.2010 в 23:51.
Lusy вне форума Ответить с цитированием
Старый 10.11.2010, 23:59   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Lusy Посмотреть сообщение
Могу кинуть свой вариант решения, но как сказала учительница - оч долгий он у меня. Можно решить быстрее через подпрограмму процедуру.
Как правило, проще оптимизировать готовое
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 11.11.2010, 00:04   #3
Lusy
Новичок
Джуниор
 
Аватар для Lusy
 
Регистрация: 10.11.2010
Сообщений: 4
По умолчанию

Ладно) Но мне говорили что у меня слишком не стандартное мышление оо" и они только больше путаются оо"

Вот:
Код:
program zachet;
uses crt;
label Metka1, Metka2, Metka3;
var b,a:array [1..10] of integer;
N,M,i,s,s2,max,g,x,c,d,p,min,h,e:integer;
begin
clrscr;
write ('Количество гирь у первого игрока(n)=');
read (n);
write ('Количество гирь у второго игрока(m)=');
read (m);
writeln ('Вес каждой из гирь у первого игрока');
s:=0;
for i:=1 to n do begin
write ('N[',i,']=');
read (a[i]);
s:=s+a[i];
end;
writeln('Общая масса гирь первого игрока=',s);
writeln('Вес каждой из гирь у второго игрока');
s2:=0;
for i:=1 to m do begin
write ('M[',i,']=');
read (b[i]);
s2:=s2+b[i];
end;
writeln('Общая масса гирь второго игрока=',s2);
max:=0;
if s<s2 then max:=s2 else max:=s;
writeln ('Максимальный общий вес',max);

Metka3:
p:=max;
if p=s then goto metka1 else if p=s2 then goto metka2;

Metka1:
min:=a[i];
for i:=1 to n do
if min>a[i] then begin min:=a[i];
x:=i;end;
writeln (min);
For i:=x to n-1 do
a[i]:=a[i+1];
a[n]:=0;
for i:=1 to n do
end;
if s<s2 then max:=s2 else max:=s;
goto Metka3;

Metka2:
min:=b[i];
for i:=1 to m do
if min>b[i] then begin min:=b[i];
x:=i;end;
writeln (min);
For i:=x to m-1 do
b[i]:=b[i+1];
b[m]:=0;
for i:=1 to m do
end;
if s<s2 then max:=s2 else max:=s;
goto metka3;

{for i:=h downto 1 do
if b[i]<b[c] then
For d:=i to c-1 do begin
b[d]:=a[d+1];
b[c]:=0; end; }

writeln (a[i]);
writeln (b[i]); end;
readkey;
end;
end.
И да, тут конечно вариант решения, но оно не работает, ага~...

Последний раз редактировалось Stilet; 11.11.2010 в 10:16.
Lusy вне форума Ответить с цитированием
Старый 11.11.2010, 00:23   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

А где работа с файлами, пардон? О_о
"in teger" пишется слитно...
У Вас программа не зацикливается случаем?
А то я впервые встречаюсь с метками в паскале( да, я нуб)
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 11.11.2010, 00:33   #5
Lusy
Новичок
Джуниор
 
Аватар для Lusy
 
Регистрация: 10.11.2010
Сообщений: 4
По умолчанию

Цитата:
А где работа с файлами, пардон? О_о
мы такого еще не проходили, поэтому она сказала что бы "входные и выходные данные" это было то что мы вводим с компьютера, и то что выдается в конечном итоге соответственно.
Цитата:
"in teger" пишется слитно...
да, простите ^ ^
Цитата:
У Вас программа не зацикливается случаем?
честно я уже не помню, я много вариантов перепробовала, но вроде бы да...
Цитата:
А то я впервые встречаюсь с метками в паскале( да, я нуб)
я еще больший нуб, ага~... это учительница мне сказала сделать метки, но знакомые сказали что этого делать нельзя было...
я запуталась оо"
блин, очень прошу, Вы сможете что нибудь с этим сделать?? Мне завтра, а вернее уже сегодня сдавать....
Lusy вне форума Ответить с цитированием
Старый 11.11.2010, 12:08   #6
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Код:
program zachet;
uses crt;
label Metka1, Metka2, Metka3;
type tarray = array[1..10] of integer;
var
 a,b : tarray;
 N,M,i,S1,S2,max,g,x,c,d,p,min,h,e:integer;

// Один ход в игре
procedure OneStep( player : Integer; var a: tarray; var CountElem : integer; var TotalWeight : Integer);
var
 i,min : Integer;
begin
min:=1;
for i:=2 to CountElem do
 if a[min]>a[i] then min:=i;
TotalWeight := TotalWeight - a[min];
writeln ('Игрок ',player,' убрал гирю ',a[min],'. Осталось на весах :',TotalWeight);
for i:= min to CountElem do a[i] := a[i+1];
CountElem := CountElem - 1;
end;

begin
clrscr;
write ('Количество гирь у первого игрока(n)=');
read (n);
write ('Количество гирь у второго игрока(m)=');
read (m);
writeln ('Вес каждой из гирь у первого игрока');
S1:=0;
for i:=1 to n do begin
write ('N[',i,']=');
read (a[i]);
S1:=S1+a[i];
end;
writeln('Общая масса гирь первого игрока=',S1);
writeln('Вес каждой из гирь у второго игрока');
s2:=0;
for i:=1 to m do begin
write ('M[',i,']=');
read (b[i]);
s2:=s2+b[i];
end;
writeln('Общая масса гирь второго игрока=',s2);
max:=0;
if S1<s2 then max:=s2 else max:=S1;
writeln ('Максимальный общий вес',max);

// Игра
while ( (S1 <> 0) and (S2 <> 0) ) do
 begin
 if S1 > S2 then OneStep(1,a,n,S1) else OneStep(2,b,m,S2)
 end;
if S1 = 0 then writeln ('Победил игрок 1') else writeln ('Победил игрок 2');
readkey;
end.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 11.11.2010, 16:30   #7
Lusy
Новичок
Джуниор
 
Аватар для Lusy
 
Регистрация: 10.11.2010
Сообщений: 4
По умолчанию

огромное спасибо *_* не знаю что бы без вас делала)))
Lusy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на "записи" (Паскаль) patisson74 Помощь студентам 1 18.11.2009 07:38
Паскаль.Программа "Верификация", "Кака бригадиру разделить заработанные деньги?".Сложные Valik102 Помощь студентам 11 23.06.2009 15:30
Паскаль.Программа "Верификация", "Кака бригадиру разделить заработанные деньги?".Сложные Valik102 Паскаль, Turbo Pascal, PascalABC.NET 3 23.06.2009 09:11
Паскаль. 2 задачи (Программа "Верификация","КАК БРИГАДИРУ РАЗДЕЛИТЬ ЗАРОБОТАННЫЕ ДЕНЬГИ") Valik102 Помощь студентам 3 20.05.2009 20:42
Задача на Турбо Паскаль "Лабиринт" H[o][o]K Помощь студентам 1 17.12.2007 18:46