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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2012, 19:02   #1
GreenMan
 
Регистрация: 16.02.2012
Сообщений: 7
Печаль Школьная олимпиадная задача

Доброго времени суток! Вчера проходил первый этап Всероссийской олимпиады школьников по информатике, наткнулся на вот такую задачку, но никак не смог её решить... http://savepic.su/2946051.htm
Я додумался лишь, что если ребят больше, чем грядок, то оптимальным будет время, предоставляющееся для вскапывания самой большой грядки (кэп не дремлет лол).
Код:
...
var ... {не заполнил, т.к. не решил до конца}
begin
assign(input,'input.txt');
reset(input);
readln(n,k); {прочитали n - число грядок, k - число ребят}
for i:=1 to n do {читаем время, выделяемое каждой грядке в отдельности}
  read(a[i]);
if k>=n 
  then 
    begin
    max:=0;
    for i:=1 to n do
      begin
      if a[i]>max
        then max:=a[i];
      end;
    assign(output,'output.txt');
    rewrite(output);
    write(max); {если число работников больше/равно числу грядок, то выводим максимальный элемент массива с временем грядок}
    close(output);
    end
    else ...
Но что, если грядок больше, чем работников? Как найти оптимальное решение? Каков алгоритм? Мы с моей учительницей информатики думали-думали, так ничего и не надумали. Помогите, пожалуйста, решить эту задачу и исправить, если уже что-то не так.

Последний раз редактировалось GreenMan; 13.11.2012 в 19:05.
GreenMan вне форума Ответить с цитированием
Старый 13.11.2012, 20:12   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Давайте разберем 1 пример :
5 3
3 5 8 2 7

1) Отсортируем массив по возрастанию (не убыванию)
Получим 2 3 5 7 8
2) Всего у нас 3 рабочих, наградим их самыми большими грядками тоесть 5 7 8
3) Остались n-k грядок. Теперь Рабочему n-1 прибавим 1 грядку, n-2 прибавим 2 грядку, n - i'тому рабочему прибавим еще i грядку. И когда i станет > n-k закончим выполнение.
4) Теперь бежим по массиву с рабочеми и ищем наибольшее значение.
Вот собственно и всё.
Уж простите, что в словесной форме, но с этой школой времени почти нет... Возможно(маловероятно) что ближе к ночи выложу код..
Poma][a вне форума Ответить с цитированием
Старый 13.11.2012, 22:29   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Эх, да задали Вы задачку человеку на День Рождения Банкета как не бывало

Код:
type
        TArr = array [1..10000] of LongInt;
procedure Swap (var a, b : LongInt);

var
	t : LongInt;

begin
	t := a;
	a := b;
	b := t;
end;


procedure SortArr (var a : TArr; const n : LongInt);

var
	i, j : LongInt;

begin
	for i := 1 to n-1 do
		for j := 1 to n-i do
			if a[j] > a[j+1] then
				Swap (a[j], a[j+1]);
end;

var
        a : TArr; // грядки
        b : array [1..1000] of Integer; // рабы
        n, k, i, j, count, max : LongInt; // k использовать как натуральное число - это ересь

begin
        ReadLn (n, k);

        for i := 1 to n do
                ReadLn (a[i]);

        SortArr (a, n);

        i := 1;
        while (i <= k) and (i <= n) do begin
                b[i] := a[n-i+1];
                Inc (i)
        end;

        count := 0;
        for i := n-k downto 1 do
                b[i+1] := b[i+1] + a[i];

        max := b[1];

        for i := 1 to k do
                if b[i] > max then
                        max := b[i];

        WriteLn (max)
end.
Вроде так. Удачи
Poma][a вне форума Ответить с цитированием
Старый 14.11.2012, 18:03   #4
GreenMan
 
Регистрация: 16.02.2012
Сообщений: 7
Хорошо

Оооо, спасибо огромное!!! Разобрался, все ок! Ещё раз спасибо
пы.сы. ну и с днем рождения прошедшим уже
GreenMan вне форума Ответить с цитированием
Старый 14.11.2012, 20:39   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Пожалуйста Потом отпишитесь пожалуйста, как сдали
P.S. Спасибо
Poma][a вне форума Ответить с цитированием
Старый 19.11.2012, 05:33   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Всем привет,
а задачка неплохая! ))
Ромаха, твоя прога на вот таких данных:
4 2
1 50 98 100
- выдает результат 100. Боюсь, это не совсем верно ). Да и вообще, я не вижу, где твоя прога учитывает то, что каждому рабочему можно давать только смежные грядки. Ты их сортируешь сразу - и благополучно забываешь изначальный порядок..

Я навскидку применил самый обычный лом - рекурсию )). Но я не уверен, пролезет ли рекурсивное решение по времени при больших n.
Код:
const
  m= 100;

var
  t: array[1..m] of int64;

function Max(a,b: int64): int64;
begin
  if a<=b then Max:= b else Max:= a
end;

function Min(a,b: int64): int64;
begin
  if a<=b then Min:= a else Min:= b
end;

function Opt(n,k: integer): int64;
var
  s,x: int64;
  i: integer;
begin
  s:= 0;
  if k=1 then begin
    for i:=1 to n do s:= s+t[i];
    Opt:= s
  end
  else begin
    s:= 0;
    x:= High(int64);
    for i:=n downto k do begin
      s:= s+t[i];
      x:= Min(x,Max(s,Opt(i-1,k-1)))
    end;
    Opt:= x
  end
end;

var
  i,k,n: integer;

begin
  readln(n,k);
  for i:=1 to n do read(t[i]);
  if k>n then k:= n;
  writeln(Opt(n,k));
  readln
end.
Тестировал не очень тщательно, возможны ошибки.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 19.11.2012, 06:54   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

TinMan, Вы вернулись! Ура.Ура.Ура!!!!

P.S. Ага, как-то я проморгал что грядки можно давать только последовательно...
Poma][a вне форума Ответить с цитированием
Старый 19.11.2012, 16:19   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Хорошо, а если так :
Код:
while n >  k do begin
      Ищем минимум;
      Сравниваем a[min-1] и a[min+1];
      И наименьшее число из сравниваемых(см.строку выше) прибавляем a[min];
      Сдвигаем массив;
      Dec (n)
end;
Но вдруг где-нить встретим не одно минимальное, а m минимальных грядок (тогда надо искать минимум уже среди соседей этих минимумов....)

Вообщем это как вариант, но очень накладно...

P.S. Не проверял
P.P.S. И уж сори что в таком виде просто очень, преочень нет времени (у самого командная дистанционная олимпиада...)
Poma][a вне форума Ответить с цитированием
Старый 19.11.2012, 19:55   #9
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

TinMan, ваша программа должна выдавать ошибку при k > n
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 19.11.2012, 22:26   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
должна выдавать ошибку
а почему? и какую ошибку? компиляции? и у Вас есть какой-то контрпример? у меня никакую ошибку не выдаёт...
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
олимпиадная задача quade1992 Паскаль, Turbo Pascal, PascalABC.NET 0 17.05.2012 18:57
школьная задача(пример) vanushka Паскаль, Turbo Pascal, PascalABC.NET 9 14.11.2011 18:07
Олимпиадная задача Sanek_ntsk Помощь студентам 4 09.11.2011 23:03
Олимпиадная задача. masashama Общие вопросы C/C++ 19 27.10.2011 14:52
Школьная задача по информатике(алгоритм) Soko123 Помощь студентам 6 22.12.2010 19:13