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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2012, 20:48   #1
Sega_AS
Пользователь
 
Регистрация: 22.02.2012
Сообщений: 15
По умолчанию acm.timus 1688

1688 Team.GOV!
Ребят помогите решить задачку крашится на 11 тесте понял из за чего

Код:
var n,ex,i,x:integer;
a:array [1..3000] of integer;
S,ss:real;
label Ext,en;
begin
Readln (ex,n);
S:=0;SS:=0;
for I:=1 to n do
begin
readln (a[i]);
s:=S+(a[i] div 3);
if S>ex then X:=i;
if S>ex then goto ext;
Writeln (S,'   ',ss); // для проверки
end;
If s<ex then  writeln ('Team.GOV!');
If s<ex then  goto en;
ext:
for I:=i to n-1 do readln (a[i]);
Writeln ('Free after ', x ,' times.'); 
en:
end.
Вводим
2000 3
2000
2000
2001
получаем 1999 4 и вывод Team.GOV!
А должно Free after 3 times.
Сижу запутался как место 4 получить 0.666(6)+0.666(6)
И если можно подскажите как Значение переменной заморозить в цыкле
P.S.
Да да на goto не смотрите не знал как заморозить значение переменной
название темы немогу сменить

Последний раз редактировалось Sega_AS; 22.02.2012 в 21:34.
Sega_AS вне форума Ответить с цитированием
Старый 23.02.2012, 17:46   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

вы используете div => получаете целые числа, отбрасывая "копейки", которые могут образовывать "рубли."

Код:
var
   t, r : Real;
   i,n,y : Integer;
begin
     readLn (y, n);

     for i := 1 to n do begin
         ReadLn (t);
         r := t/3 + r;
         if r >= y then begin
            WriteLn ('Free after ', i, ' times');
            Halt;
         end;
     end;

     if r >= y then
        WriteLn ('Free after ', n, ' times')
     else
        WriteLn ('Team.GOV!')
end.
и не понял за чем вам массив.

а на счет заморозки :
если вы уже всё сосчитали то зачем вам тратить время? просто Break

Последний раз редактировалось Poma][a; 23.02.2012 в 17:49.
Poma][a вне форума Ответить с цитированием
Старый 23.02.2012, 23:08   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

никаких делений!

нужно число N умножить на 3 - получите требуемую сумму, по достижении (превышении которой ) нужно выдавать ответ и выходить из цикла (завершать программу).
например,
если сумма n=1666
то после умножения её на 3 получаем 4998
складываем в цикле
1) 2000 < 4998
тогда следующее
2) 2000 + 1024 = 3024 < 4998
тогда следующее
3) 3024 + 900 = 3924 < 4998
тогда следующее
4) 3924 + 1156 = 5080 > 4998 ! ДА!
вывести ответ 4 раза и прервать работу

если дошли до конца и не набрали нужную сумму - выдать "Team.GOV!"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.02.2012, 23:21   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Serge, а почему
Цитата:
никаких делений!
?

у меня с ними всё пашет, даже очень хорошо...
Poma][a вне форума Ответить с цитированием
Старый 24.02.2012, 08:55   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Serge, а почему ?

у меня с ними всё пашет, даже очень хорошо...
верю!

я предложил отказать от делений исключительно с точки зрения красоты (в коде остаётся только суммирование) и быстродействия: мало того, что сама по себе операция деления занимает больше тактов, так и ещё приходится выполнять её в цикле (ну, представьте, например, что речь идёт о нескольких ТЫСЯЧАХ (до 3-х тысяч) обедов по одному рублю.
Кроме того, можно отказаться от использования вещественного типа данных (а это ещё одни минус к точности и быстродействию).

а ведь алгоритм поиска решения при этом (при отказе от деления) ВООБЩЕ не изменяется!

Т.е. выигрыш - на лицо, минусов я не вижу, так объясните почему не решить задачу чуть-чуть красивее и эффективнее?!!

вот так примерно будет выглядеть ПОЛНЫЙ текст программы:
Код:
var  i, n, m, sumDinner, OneDinner : integer;
begin
  Readln(n, m);
  i:=0;
  sumDinner := 0; 
  n := n * 3;
  while (i<m) and (n <= SumDinner) do begin
     Readln(OneDinner);
     SumDinner := SumDinner + OneDinner;
     Inc(i);
  end;
  if n>SumDinner then WriteLn('Free after ',i,' times')
  else WriteLn('Team.GOV!');  
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.02.2012, 15:28   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Serge, было ощущение что вы приняли мое решение в штыки, как будто там была ошибка, либо что еще. А поскольку автор темы предложил решение с деление, то я лишь исправил предложенный вариант. А на счет правильности и эффективности вашего алгоритма спору нет, он лучше моего.
Poma][a вне форума Ответить с цитированием
Старый 25.02.2012, 23:35   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Serge, было ощущение что вы приняли мое решение в штыки, как будто там была ошибка, либо что еще. А поскольку автор темы предложил решение с деление, то я лишь исправил предложенный вариант.
извините, если бы слишком резок.

Просто, если я вижу, что есть два варианта решения и один из них ЛУЧШЕ, тогда я не понимаю, почему нужно выбирать ХУДШИЙ вариант (хотя и работоспособный)!

а то, что Вас вариант с делением рабочий, я не спорил, и даже отметил это постом выше..

ладно. будем считать, что разобрались.
я считаю, что тему можно считать закрытой...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.02.2012, 21:49   #8
Sega_AS
Пользователь
 
Регистрация: 22.02.2012
Сообщений: 15
По умолчанию Спасибо

Цитата:
Сообщение от 'Poma
вы используете div => получаете целые числа, отбрасывая "копейки", которые могут образовывать "рубли."
Да но эти копейки мешали при проходе третьего теста или у меня в логике ошибка была....

Подправил ваше под условие обязательно надо считать все данные а потом только вывести Free after X times.
Код:
var
  r: Real;
  i, n, y, z: Integer;
  t: array [1..100000] of double;

label ext;
begin
  readln(y, n);
  
  for i := 1 to n do 
  begin
    Readln(t[i]);
    r := t[i] / 3 + r;
    if r >= y then
      goto ext;
  end;
  
  if r >= y then
  begin
    WriteLn('Free after ', n, ' times.');
    halt;
  end
     else
  begin
    WriteLn('Team.GOV!');
    halt;
  end;
  ext:          // Нам обязательно надо считать все данные а потом только вывести  Free after X times.
  z := i;                                         
  for i := i to n - 1 do ReadLn(t[i]);
  WriteLn('Free after ', z, ' times.');
end.
Но опять третий тест непроходит...
Буду счас через N*3
Первая проходила до 11 теста и там не работала с 2000 3
а если изменинить div на / чтобы оставались 0.6666(6) то зависала на 3 тесте
поэтому по логике легче всего решить через N*3

Последний раз редактировалось Sega_AS; 26.02.2012 в 22:15.
Sega_AS вне форума Ответить с цитированием
Старый 26.02.2012, 21:55   #9
Sega_AS
Пользователь
 
Регистрация: 22.02.2012
Сообщений: 15
По умолчанию

3 тест......
Код:
var
  r: Real;
  i, n, y, z: Integer;
  t: array [1..100000] of double;

label ext;
begin
  readln(y, n);
  y:=y*3;
  for i := 1 to n do 
  begin
    Readln(t[i]);
    r := t[i]+ r;
    if r > y then
      goto ext;
  end;
  
  if r > y then
  begin
    WriteLn('Free after ', n, ' times.');
    halt;
  end
     else
  begin
    WriteLn('Team.GOV!');
    halt;
  end;
  ext:          // Нам обязательно надо считать все данные а потом только вывести  Free after X times.
  z := i;                                         
  for i := i to n - 1 do ReadLn(t[i]);
  WriteLn('Free after ', z, ' times.');
end.

Последний раз редактировалось Sega_AS; 26.02.2012 в 22:21.
Sega_AS вне форума Ответить с цитированием
Старый 27.02.2012, 14:25   #10
Sega_AS
Пользователь
 
Регистрация: 22.02.2012
Сообщений: 15
По умолчанию

Понял немного подправил все робит...
Всем спасибо
Код:
var
   y, z,n1,t,r:int64;
   i,n:longint;

label ext;
begin
  readln(y, n);
  n1:=n;
  y:=y*3;
  R:=0;
  for i := 1 to n1 do
  begin
    Readln(t);
    r := t+ r;
    if r > y then
      goto ext;
  end;

  if r > y then
  begin
    WriteLn('Free after ', n, ' times.');
    halt;
  end
     else
  begin
    WriteLn('Team.GOV!');
    halt;
  end;
  ext:
  z := i;
  for i := i to n1 - 1 do ReadLn(t);
  WriteLn('Free after ', z, ' times.');
end.
Sega_AS вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
acm олимпиада _rofl Общие вопросы по Java, Java SE, Kotlin 1 06.04.2011 16:19
ACM Аля-Улю Общие вопросы .NET 0 25.04.2010 13:35
acm.timus.ru ИльяМалиновский Свободное общение 12 28.12.2009 18:36
Задачка с сайта acm.timus.ru phpcreator Помощь студентам 9 17.10.2009 15:19