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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 20:35   #1
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию Калитка в заборе желательно паскаль

Цитата:
Ограничение по времени: 0 .5 секунд
Дядя Федор, кот Матроскин и Шарик решили обновить забор вокруг своего сада в Простоквашино. Матроскин и Шарик, недолго думая, вкопали N столбов вдоль одной из сторон участка. Это
очень сильно расстроило Дядю Федора, так как его друзья забыли о самом главном - калитка
должна находиться именно на этой стороне, и для нее необходимо было оставить проем шириной как минимум W . Теперь им придется выкапывать некоторые столбы.
Чтобы работа не пропадала даром, выкопать надо как можно меньше столбов. Помогите Дяде Федору определить, сколько же столбов нужно выкопать. После выкапывания столбов должен найтись промежуток (между двумя оставшимися столбами, или между оставшимся столбом и концом стороны участка, или между двумя концами стороны участка) ширины больше или равной W .
Формат входного файла
Первая строка содержит два целых числа N и W  количество вкопанных столбов и минимально
необходимую ширину пројма для калитки соответственно. Гарантируется, что 0 ≤ N ≤ 100000 и
что 0 ≤ W ≤ 10^9.
Будем считать, что вдоль интересующей нас стороны участка введена ось координат. Во второй
строке входного файла находятся два числа L и R  координаты левого и правого конца этой сторо-
ны (L < R) . Далее следуют N чисел  координаты вкопанных столбов. Все координаты (включая
L и R)  различные целые числа, по модулю не превосходящие 109. Гарантируется, что все столбы
вкопаны между левым и правым концами стороны.
Формат выходного файла
В единственной строке выходного файла должно быть минимальное число столбов, которые надо
выкопать. Если решения нет, то выведите в выходной файл строку, содержащую число 1 .
Примеры
stdin
3 2
2 6
3 4 5
------
stdout
1
-----
3 2
1 6
4 3 5
-----
0
-----
3 5
1 7
5 3 4
-----
3
Совсем не пойму, что делать . Пытался что-то наваять (не без помощи), но не вышло.
Код:
var
  n, w, l, r, i, cur, res: longint;
  a: array[0..100000] of longint;

procedure sort(l, r: longint);
var
  i, j, x, t: longint;
begin
  if l >= r then exit;
  i := l;
  j := r;
  x := a[(l + r) div 2];
  repeat
    while a[i] < x do inc(i);
    while a[j] > x do dec(j);
    if i <= j then begin
      t := a[i];
      a[i] := a[j];
      a[j] := t;
      inc(i); dec(j);			
    end;
  until i > j;	
  sort(l, j);
  sort(i, r);
end;

begin
  Read(n, w, l, r);
  for i := 1 to n do
    read(a[i]);
  sort(1, n);
  res := maxlongint;
  a[0] := l;
  cur := 0;
  i := 1;
  while i <= n do 
  begin
    while (i <= n) and (a[i] - a[cur] < w) do
      inc(i);
    if i - cur < res then
      res := i - cur;
    cur := i - 1;
    if res = 1 then break;	
  end;
  if w > r - l + 1 then
    res := 0;
  write(res - 1);
end.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 16.01.2013, 21:28   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Не вышло - это плохо. Наверное, надо что-нибудь сделать, и всё получится.

Что значит - "не вышло"? Об этом предлагается догадываться телепатически?
1) Сортировка работает? Быстро?
2) В предложенных случаях получаются правильные ответы?
3) Предельный случай, когда нужно выкопать все столбы, проверен? Нужный результат получен?
4) Предельный случай, когда не надо ничего выкапывать, проверен? Нужный результат получен?
5) Рассмотрите такой ввод:
Код:
3 4
1 9
2 4 7 8
Правильный результат (1) получается?
6) Какие у Вас мысли о причинах ошибки?
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 21:34   #3
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Ошибка - неправильный ответ в 60% случаев. Скорости хватает - полсекунды на ура.
На Вашем тесте выдает 1 - вроде, так и надо. В предложеных все правильно
Этот код не совсем мой, поэтому я и сам не пойму все. Но автор сказал, что почти правильно. Надо чего-то поправить. А что - загадка.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут

Последний раз редактировалось Izobara; 16.01.2013 в 21:43.
Izobara вне форума Ответить с цитированием
Старый 16.01.2013, 21:54   #4
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Выклянчил решение - урряааа!..
Код:
Var n , w , j , i , res : longint;
	a : array[0..100001] of longint;

Procedure sort(l , r : longint);
var i , j , x , t : longint;
Begin
	if l >= r then exit;
	i := l;
	j := r;
	x := a[(l + r) div 2];
	repeat
		while a[i] < x do inc(i);
		while a[j] > x do dec(j);
		if i <= j then begin
			t := a[i];
			a[i] := a[j];
			a[j] := t;
			inc(i); dec(j);			
		end;
	until i > j;	
	sort(l , j);
	sort(i , r);
End;

Begin
	Read(n , w);
	read(a[0] , a[n + 1]);
	if a[n + 1] - a[0] < w then begin
		writeln(-1);
		exit;
	end;
	for i := 1 to n do
		read(a[i]);
	sort(1 , n);
	j := 0;
	res := n;
	for i := 0 to n do begin
		if j <= i then 
			j := i + 1;
		while (j <= n) and (a[j] - a[i] < w) do
			j := j + 1;
		if (a[j] - a[i] >= w) and (j - i - 1 < res) then
			res := j - i - 1;	
	end;
	writeln(res);
End.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Табулирование функций (Си)(Geany желательно) Alexey22rus Помощь студентам 0 26.06.2012 18:20
Два клиента на БД. (желательно на VB.net) vilson Фриланс 0 09.05.2012 14:10
Желательно Delphi, но можно и алгоритм Nikita++ Помощь студентам 1 23.05.2011 07:17
Паскаль Задачи. примерно 10 буду рад если решите... желательно с блок схемами. Буду сильно благодарен. Азарт Помощь студентам 8 26.03.2009 23:51
как сделать чтоб экселев. файл висел открытым на рабочем столе как афиша на заборе? Мара Помощь студентам 6 24.07.2008 13:29