задача C где-то так (делфю запускать влом, но идея такая):
function Split(const AText: string; const AList: TStringList): integer;
var
bIsQuoted, bIsSeparator: boolean;
s, t: string;
i: integer;
begin
s:= TrimRight(AText);
i:= Length(s);
s:= TrimLeft(s);
result:= i-Length(s);
bIsQuoted:= false;
bIsSeparator:= false;
AList.BeginUpdate;
AList.Clear;
for i:=1 to Length(s) do
begin
case s[i] of
'"':
begin
bIsQuoted:= not bIsQuoted;
bIsSeparator:= false;
end;
' ', #9:
if bIsQuoted then t:= t+s[i]
else
if not bIsSeparator then
begin
bIsSeparator:= true;
AList.Add(t);
t:= '';
end;
else
begin
bIsSeparator:= false;
t:= t+s[i]
end
end
end;
AList.Add(t);
AList.EndUpdate;
end;
procedure Main;
var
i, o, x: TStringList;
acol, arow: integer;
t, c: array og integer;
r, n: integer;
begin
i:= TStringList.Create;
i.LoadFromFile('b.in');
o:= TStringList.Create;
x:= TStringList.Create;
n:= strtoint(i[0]);
setlength(t, n); // массив под строку;
setlength(c, n); // массив по счетчики;
for arow:= 0 to n-1 do
begin
Split(i[arow], x); // режем строку на числа, разделитель пробел(ы)
for acol:= 0 to n-1 do begin c[acol]:= 0; n[acol]:= strtoint(x[acol]) end; // читаем строку
for acol:= 0 to n-1 do inc(c[n[acol]]); // считаем число повторений числа в строке
r:= 0; // кол-во чисел с однократным вхождением в строке
for acol:= 0 to n-1 do
if c[acol]=1 then inc(r)
o.AddStrring(inttostr(r)
end;
o.SaveToFile('b.out');
x.Free;
o.Free;
i.Free
end
Задача B тоже, в принципе, тривиальная. Писать влом, алгоритм такой:
- читаем число с строку,
- если начинается с 9, то ответ не существует (т.к. начинается с 0)
- создаем массив счетчиков [0..9]
- проходим вдоль числа, считаем сколько каждая из цифр входит в число;
- если перестановка существует, то кол-во цифр 0 и 9, 1 и 8, 2 и 7, 3 и 6, 4 и 5 должно быть равным между собой
- если не равно, то результат -1
- если равно, то генерим число - проходим вдоль исходного и считаем 9-a[i]
Последний раз редактировалось AnriRS; 03.11.2007 в 20:34..
|