Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Несколько задач, которые не проходят несколько проверок

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
kir55rus
Отправлено: 16 Февраля, 2013 - 18:18:22
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




Здравствуйте

Задача 1.
в файле i.txt хранятся данные в формате:

CODE (htmlphp):
скопировать код в буфер обмена
  1. 1 0 1 1 1
  2. 1 1 1 0 1
  3. 0 1 1 1 1
  4. 1 1 0 1 1
  5. 1 1 1 0 1
  6. r r y q v
  7. f c a s p
  8. p k j h t
  9. r t h t y
  10. u h I s t

первые 5 строчек - это своеобразный ключ
последние 5 строчек - замок, к которому нужно "примерить" ключ.
Как это все происходит:
давайте представим, что ключ - это бумажка (0 - отверстие, 1 - сам лист).
а замок - это буквы, написанные на листе

Нам нужно определить, подходит ли ключ. А подходит он только в том случае, если после наложения останутся буквы t, s, t, a, r (то есть их положение совпадет с нулями).
Важное замечание! ключ можно поворачивать по часовой стрелке до 3х раз. то есть наложили, если не подошел, перевернули, опять наложили и т.д.

В ответ надо вывести No, если ключ не подходит, либо, если подходит:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Yes
  2. количество необходимых поворотов


для примера выше будет выведен ответ


еще 1 пример входного файла:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 1 1 1 1 1
  2. 1 0 1 1 1
  3. 1 1 1 1 0
  4. 1 1 1 1 0
  5. 0 1 0 1 1
  6. r r y q v
  7. f c a s p
  8. p k j h t
  9. r t h t y
  10. u h I s t

Ответ на выходе должен быть No

Итак, мой исходник:
PHP:
скопировать код в буфер обмена
  1. $data = file('i.txt');//загружаем данные
  2.  
  3. $key[0] = explode(" ", $data[0].' '.$data[1].' '.$data[2].' '.$data[3].' '.$data[4]); // массив для ключа. каждый элемент массива - цифра 1 или 0
  4. $code = explode(" ", $data[5].' '.$data[6].' '.$data[7].' '.$data[8].' '.$data[9]);     // замок. принцип, как и у ключа
  5.  
  6. for($i=0; $i < 5; $i++) // "переварачиваем" ключ по часовой стрелке. это 1 поворот
  7.         for($j=20+$i; $j >= 0; $j -= 5)
  8.                 $key[1][] = $key[0][$j];
  9.                
  10. $key[2] = array_reverse($key[0]); // 2 поворота
  11. $key[3] = array_reverse($key[1]); // 3 поворота
  12.  
  13. $t = "No"; // начальное значение ответа
  14.  
  15. for($i=0; $i<4; $i++){ // "запоминаем" буквы, которые были на месте дырок во всех случаях
  16.        
  17.         foreach($key[$i] as $k => $v){ //если попали на 0, то записываем в массив answ букву, которая на его месте
  18.                 if((int)$v == 0) $answ[$i][] = $code[$k];
  19.         }
  20.        
  21.         sort($answ[$i]); //сортируем массив в алфавитном порядке
  22.        
  23.         if(trim($answ[$i][0]) == 'a' && trim($answ[$i][1]) == 'r' && trim($answ[$i][2]) == 's' && trim($answ[$i][3]) == 't' && trim($answ[$i][4]) == 't'){ //если все буквы подошли, то меняем сообщение
  24.                 $t = "Yes\r\n".$i;
  25.                 break;
  26.         }
  27.        
  28. }//если буква не подошла, то повторяем цикл
  29.  
  30.  
  31. file_put_contents('o', $t); //записываем ответ


Скрипт проходит 2 из 10 тестов. не могу найти проблему. (тестирую не я. еще примеров входных файлов нет)


Задача 2
Ребята собрались на озере и решили поиграть в блинчики (кидать камушки в воду, чтобы они отскакивали). всего было N человек. Ребята договорились, что считать количество соприкосновений они будут только на дистанции L от берега.
Нужно сказать, кто из мальчиков выиграл

Входные данные:
Первая строка - число N
Вторая строка - дистанция L
последующие строки - информация о броске мальчика в формате: первая цифра H - количество соприкосновений с водой, затем H чисел - расстояний от берега до места, где камень коснулся воды

Пример входного файла:


3 участника
4 - ограничение
блинчик первого мальчика каснулся с водой всего 1 раз на дистанции 1 метр от берега
блинчик второго мальчика подскочил 2 раза. 1 касание с водой на 1 метре от берега, второе - на 2
и т.д.

на выходе мы должны получить порядковый номер мальчика, который выиграл. в данном случае - 3

2й пример входного файла:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 3
  2. 4
  3. 1 8
  4. 3 1 3 4
  5. 6 20 30 40 100 110 120

Ответ - 2

Мой исходник:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $data = file('i.txt');//загружаем данные
  3.  
  4. $n = $data[0]; //количество участников
  5. $l = $data[1]; // дистанция
  6.  
  7. $players = array(); //массив с результатами
  8.  
  9. for($i=2, $c = $n+2; $i< $c; $i++){ //перебор результатов
  10.         $temp = explode(" ", $data[$i]); //массив с результатами 1 мальчика
  11.         $c2 = $temp[0]; // количество прыжков блинчика
  12.         unset($temp[0]);
  13.        
  14.         $players[$i-1] = 0;
  15.         foreach($temp as $v) //перебираем результат
  16.                 if((int)$v <= (int)$l){ $players[$i-1] += (int)$v; //если результат меньше ограничения, то записываем его
  17.                
  18.                
  19.         }
  20.        
  21.  
  22.        
  23.        
  24. }
  25.  
  26.  
  27.  
  28. arsort($players); //сортируем от большего к меньшему
  29.  
  30.  
  31. foreach($players as $k => $v){
  32.         file_put_contents('o.txt', trim($k)); //записываем результат
  33.         break;
  34. }


Скрипт проходит 10 из 20 тестов


Задача 3
есть строка вида abbababa. нужно сказать, сколько в ней цепочек, в которых количество a и b одинаковое.

Например, строка aba
ответ: 2 цепочки (ab и ba)

пример2: строка abbababa
ответ: 13

порядок букв в цепочках может повторяться! Например, в прошлом примере будет несколько одинаковых цепочек:
abbababa

Мой исходник:
PHP:
скопировать код в буфер обмена
  1. $data = file('i.txt');//загружаем данные из файла. каждая строчка будет отдельным элементом массива
  2.  
  3. $strarr = array();
  4.  
  5. $str=trim($data[1]);//str = строчке
  6.  
  7. for($i=0, $len=strlen($str)-2; $i<= $len; $i++){ // цикл будет повторяться до тех пор, пока i будет меньше или равен длине строки
  8.        
  9.        
  10.         for($j=2, $len2=strlen($str); $j <= $len2; $j++){ // цикл повторяется до тех пор, пока j <= длине новой строки
  11.                
  12.                 $strarr[] = substr($str, 0, $j); //в массив заносим варианты строк. substr обрезает строку с 0 по j-й символ. то есть из строки abcd мы получим массив array(ab, abc, abcd);
  13.         }
  14.        
  15.         $str=substr($str, 1); // убираем самый левый символ. то есть из строки abcd получим bcd
  16.        
  17. }
  18.  
  19. //после всех этих кругов из строки abcd получим массив: arr(ab, abc, abcd, bc, bcd, cd)
  20.  
  21. $c=0; //количество подходящих цепочек
  22.  
  23. foreach($strarr as $v){ //пребор массива. $v - значение элемента массива
  24.         //echo $v.'<br>';
  25.         $a=0; $b=0;
  26.         $a = substr_count($v, "a"); // считаем, сколько символов 'a' в строке
  27.         $b = substr_count($v, "b"); // сколько 'b' в строке
  28.         if($a == $b && $a !=0 && $b != 0) $c++; // если количество равно, то увеличиваем C на 1
  29. }
  30.         echo $c;
  31. file_put_contents('o.txt', $c); //записываем это число в файл

p.s.комментарии делал на буква abcd, чтобы было нагляднее


И последняя задача
На каждой клетке поля размером NxN лежит цифра. Путешественник идет по полю и суммирует числа. как только он получает число K или больше, он останавливается. Нужно определить на какой клетке он остановился. Либо, если он не досчитал до числа K, то нужно вывести 0

Внимание. Свое движение человек начинает в верхнем левом углу. затем идет вправо до конца поля, спускается на 1 клетку вниз, идет до конца влево, опять спускается на 1 келтку вниз и т.д.

Пример входных данных:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 4 24
  2. 1 2 3 4
  3. 1 2 3 4
  4. 1 2 3 4
  5. 1 2 3 4

4 - число N (размер поля)
24 - K (необходимая сумма)
в остальных строчках - цифры, которые лежат на поле

ответ для данного примера - 11

второй пример:
PHP:
скопировать код в буфер обмена
  1. 4 50
  2. 1 2 3 4
  3. 1 2 3 4
  4. 1 2 3 4
  5. 1 2 3 4

ответ - 0

мой исходник:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $data = file('i.txt'); //загружаем данные
  4.  
  5. $a = explode(" ", $data[0]); //массив. первый элемент - N, второй - K
  6.  
  7. $track = array(); //создаем массив, в котором в нормальном порядке будут расположены числа
  8.  
  9. for($i=0; $i < $a[0]; $i++)
  10.         if($i % 2 == 0) $track = array_merge($track, explode(" ", $data[1+$i]));
  11.         else $track = array_merge($track, array_reverse(explode(" ", $data[1+$i])));
  12. /*
  13. если это первая строчка, то переворачивать ее не надо => записываем как есть
  14. если это вторая строчка, то ее надо перевернуть => переворчиваем и дописываем в первый массив
  15. и т.д.
  16. */
  17.        
  18.  
  19. $n=0; $b=0;
  20. for($i=0, $c=$a[0]*$a[0]; $b < $a[1] && $i < $c; $i++, $n++) //проходим по полученной дороге
  21.         $b += $track[$i]; //если мы еще не набрали нужную сумму и если поле не закончилось, то прибавляем число с клетки
  22.  
  23.  
  24. if($b >= $a[1]) $t = $n; //если мы набрали нужное число, то записываем его в ответ
  25. else $t = 0; //иначе в ответ - 0
  26. file_put_contents('o.txt', $t); //выводим ответ


скрипт проходит 18 из 20 тестов


Заранее благодарен за помощь. я не прошу давать мне готовые исходники, можете просто подсказать, в каком месте может возникнуть ошибка при таких-то и таких-то значениях

(Отредактировано автором: 16 Февраля, 2013 - 18:19:17)

 
 Top
philimon
Отправлено: 16 Февраля, 2013 - 20:52:02
Post Id


Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Окт. 2007  
Откуда: Моск. обл.


Помог: 2 раз(а)




Про первое задание:
попробуйте выводить вашу матрицу при каждом поворачивании

мой вариант:
PHP:
скопировать код в буфер обмена
  1.  
  2. // $key - "ключ", $letters - "замок", $alist - массив букв, которые должны остаться после наложения "ключа" на "замок"
  3. function right($key)
  4. {
  5.         $skey = array(0 => array(), 1=>array(), 2=>array(), 3=>array(), 4=>array());
  6.         $n = 0;
  7.         for($i = 0; $i < 5; $i ++)
  8.         {
  9.                 $m = 0;
  10.                 for ($j = 4; $j > -1; $j --)
  11.                 {
  12.                         $skey[$i][$m] = $key[$j][$i];
  13.             $m ++;
  14.         }
  15.         }
  16.         return $skey;
  17. }
  18.  
  19. function check($key, $letters, $alist)
  20. {
  21.         for($i = 0; $i < 5; $i ++)
  22.         {
  23.                 for($j = 0; $j < 5; $j ++)
  24.                 {
  25.                         if ($key[$i][$j] == 0)
  26.                         {
  27.                                 $index = array_search($letters[$i][$j], $alist);
  28.                                 if($index !== false)
  29.                                 {
  30.                                         unset($alist[$index]);
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35.  
  36.         if (count($alist) == 0)
  37.         {
  38.                 return true;
  39.         }
  40.         else
  41.         {
  42.                 return false;
  43.         }
  44. }

(Отредактировано автором: 16 Февраля, 2013 - 21:50:25)

 
 Top
kir55rus
Отправлено: 17 Февраля, 2013 - 11:41:06
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




philimon, Спасибо. Взял из вашего способа проверку. Теперь скрипт проходит 9 из 10 тестов..

матрицу проверял. вот результат: (сделал на буквах, чтобы было легче проследить перемещение. как оказалось, все правильно)

CODE (htmlphp):
скопировать код в буфер обмена
  1. rryqv
  2. fcasp  - 0 поворотов
  3. pkjht
  4. rthty
  5. uhIst
  6.  
  7.  
  8. urpfr  - 1 поворто
  9. htkcr
  10. Ihjay
  11. sthsq
  12. tytpv
  13.  
  14.  
  15. tsIhu  - 2 поворота
  16. ythtr
  17. thjkp
  18. psacf
  19. vqyrr
  20.  
  21.  
  22. vptyt  - 3 поворота
  23. qshts
  24. yajhI
  25. rckth
  26. rfpru


Получается, проблема где-то в самой "примерке" и проверке..

(Отредактировано автором: 17 Февраля, 2013 - 11:42:11)

 
 Top
philimon
Отправлено: 17 Февраля, 2013 - 20:02:01
Post Id


Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Окт. 2007  
Откуда: Моск. обл.


Помог: 2 раз(а)




Вот если бы посмотреть на этот ключ и замок, на котором проверка не проходит, было бы проще
 
 Top
kir55rus
Отправлено: 18 Февраля, 2013 - 13:18:24
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




да.. но сделать это не получится, т.к. входные файлы не дают на руки Недовольство, огорчение
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Если скрипт не работает »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB