Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
max_besheniy
25 / 25 / 4
Регистрация: 21.11.2013
Сообщений: 208
1

Джентельмены удачи

26.12.2013, 22:00. Просмотров 293. Ответов 3
Метки нет (Все метки)

Есть задача:
Банда Доцента на даче учит английский язык и играет в города. Каждый по очереди называет город по английски, начинающийся на ту букву, на которую заканчивается предыдущее название и естественно кто-то ошибается. Кому первому и за какой город Доцент "порвет пасть"?
Входные данные:
Во входном потоке в первой строке через пробел перечислены клички бандитов;
Во второй строке - перечислены через пробел названия городов.
Клички бандитов и названия городов записаны английскими буквами, начинаются с большой и содержат более одной буквы. Длина каждой из строк не превышает 255 символов.

Выходные данные:
В выходной поток вывести единственную строку, состоящую из двух слов - клички бандита и названия города, записанных через один пробел.

Пример входного файла (input.txt):
Kosoj Hmyr Vasilij
Kyiv Vitebsk Krakov Erevan Norilsk
Пример выходного файла (output.txt):
Kosoj Erevan

Уже замучался решать. Вот мойкод
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var s1,s2,s3,s4,s5:string;
x,y:string;
i,j,n,n1,n2,k1,k2,n4:longint;
a,b:array[0..100] of string;
f:boolean;
begin
readln(s1);
s1:=s1+' ';
readln(s2);
s2:=s2+' ';
n1:=length(s1);
n2:=length(s2);
i:=1;
k1:=0;
k2:=0;
while i<=n1 do begin
s3:='';
while s1[i]<>' ' do begin
s3:=s3+s1[i];
inc(i);
end;
if s3<>'' then begin
inc(k1);
a[k1]:=s3;
end;
inc(i);
end;
i:=1;
while i<=n2 do begin
s3:='';
while s2[i]<>' ' do begin
s3:=s3+s2[i];
inc(i);
end;
if s3<>'' then begin
inc(k2);
b[k2]:=s3;
end;
inc(i);
end;
i:=1;
f:=false;
repeat
j:=1;
s4:=b[i];
n4:=length(s4);
while j<=k1 do begin
inc(i);
s5:=b[i];
if upcase(s4[n4])<>s5[1] then begin
f:=true;
if j+1>k1 then x:=a[1]
else
x:=a[j+1];
y:=b[i];
end
else
begin
s4:=s5;
n4:=length(s4);
end;
inc(j);
end;
until f=true;
write(x,' ',y);
end.
Не проходит 70 процентов тестов, помогите, не могу уже. Много рантаймов и неправильного формата вывода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2013, 22:00
Ответы с готовыми решениями:

Пирамида удачи!
Здравствуйте! помогите кто-то решить задачу, я её пытаюсь решить уже два месяца. Каждый может...

Периодически открывается окно браузера Вулкан удачи
Здравствуйте. Никогда не отличался безответственностью и беспомощностью в пользовании ПК но тут...

В Москве стартовала выставка "Символ удачи"
Передвижная выставка, которую организовали компании Intel и ЗАО «Сони Электроникс» теперь в Москве....

Создать файл, содержащий сведения о удачи студентами 1 курса кафедры "ЭВМ" сессии
Создать файл, содержащий сведения о удачи студентами 1курса кафедры &quot;ЭВМ&quot; сессии. Структура записи:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
27.12.2013, 08:41 2
см комментарии:
Цитата Сообщение от max_besheniy Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while j<=k1 do begin
inc(i);
s5:=b[i];
if upcase(s4[n4])<>s5[1] then begin// даже если выполнится это условие (и f станет true), то цикл while j<=k1 do будет продолжаться и очень велика вероятность выхода за границы массива b[].
f:=true;
if j+1>k1 then x:=a[1]
else
x:=a[j+1];
y:=b[i];
end
else
begin
s4:=s5;
n4:=length(s4);
end;
inc(j);
end;
Условие while j<=k1 do перепишите так:
Pascal
1
while (f=false) and (j<=k1) do begin
И еще один вариант, как переменную пускать по круговому циклу и обойтись без вот этих:
Цитата Сообщение от max_besheniy Посмотреть сообщение
Pascal
1
2
3
4
5
6
repeat
j:=1;
.....
while j<=k1 do begin
.....
until f=true;
Например есть переменная N (в приведенном тесте это 3 - количество бандитов)
Нам нужно чтобы переменная L меняла свои значения от 1 до N по кругу, тогда делаем так:
Pascal
1
2
3
4
5
6
7
8
9
10
L:=0;
while (здесь условие или пока f не станет равно true или пока не переберем все города) do begin
// нужное нам значение L+1
... 
// если нужно следующее значение L то делаем так:
inc(L);
L:=L mod N;
...
end;
// здесь нужный нам бандит под номером L+1
0
max_besheniy
25 / 25 / 4
Регистрация: 21.11.2013
Сообщений: 208
27.12.2013, 15:12  [ТС] 3
Исправил цикл, прошло больше половины, но рантаймы блин. Как вставить переменную с бандитами не понял.

Добавлено через 1 минуту
Только что поменял стринг на ансистринг и все прошло. Условие задачи было некорректно
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3904 / 2561 / 2085
Регистрация: 22.11.2013
Сообщений: 7,160
29.12.2013, 20:55 4
Можно, например, так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function GetWord(src: string; var dst: string; var i: integer): boolean;
var
  j: integer;
begin
  GetWord:=false;
  while (i<=Length(src)) and (src[i]=' ') do inc(i);
  if i>Length(src) then Exit;
  j:=i;
  while (i<=Length(src)) and (src[i]<>' ') do inc(i);
  dst:=Copy(src,j,i-j);
  GetWord:=true;
end;
 
var
  b, t, w, w2: string;
  nb, nt, i: integer;
begin
  Assign(input,'input.txt'); Assign(output,'output.txt');
  Reset(input); Rewrite(output);
  ReadLn(b); ReadLn(t);
  nb:=0; i:=1;
  while GetWord(b,w,i) do inc(nb);
  i:=1; nt:=1; GetWord(t,w,i);
  while GetWord(t,w2,i) and (UpCase(w[Length(w)])=UpCase(w2[1])) do begin
    w:=w2; inc(nt);
  end;
  nt:=nt mod nb; i:=1;
  for nt:=nt downto 0 do GetWord(b,w,i);
  WriteLn(w,' ',w2);
end.
0
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru