На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Мои решения задач. На половине тестов не пашут.
NewDomino
Пробуем поставить все камни в последовательность.
Потом смотрим, не остался ли какой-то камень. Для каждого оставшегося
Если это дубль, пробуем его вставить все равно куда где есть накие числа.
Если нет и на концах цепочки не его же числа - значит, он лишний и не сходится.
type kamen=record
n1,n2:byte;
used:boolean;
end;
var
fnd,i,j,k,pc:integer;
D:array[1..1000] of kamen;
P:array[1..2000] of byte;
f:boolean;
label newc;
begin
read(k);
for i:=1 to k do read(D[i].n1,D[i].n2);
readln;
{ k:=5;
D[1].n1:= 2; D[1].n2:= 1;
D[2].n1:= 2; D[2].n2:= 2;
D[3].n1:= 3; D[3].n2:= 4;
D[4].n1:= 3; D[4].n2:= 1;
D[5].n1:= 2; D[5].n2:= 4;
{otv 2 1 1 3 3 4 4 2 2 2}
p[1]:=d[1].n1;
p[2]:=d[1].n2;
pc:=2;
d[1].used:=true;
fnd:=d[1].n2;
newc:
for i:=1 to k do
if not d[i].used then
begin
f:=false;
if d[i].n1=fnd then
begin
{ writeln('== ',i);}
inc(pc); p[pc]:=d[i].n1;
inc(pc); p[pc]:=d[i].n2;
f:=true;
fnd:=d[i].n2;
end else
if d[i].n2=fnd then
begin
{ writeln('=R ',i);}
inc(pc); p[pc]:=d[i].n2;
inc(pc); p[pc]:=d[i].n1;
f:=true;
fnd:=d[i].n1;
end;
if f=true then
begin
d[i].USED:=TRUE;
goto newc;
end;
end;
{lishnie}
f:=true;
for i:=1 to k do
if d[i].used=false then
begin {lost unit}
if d[i].n1=d[i].n2 then {DUBL', vstavlaem kuda popalo}
begin
j:=1;
while (p[j]<>d[i].n1) and (j<=pc+1) do inc(j);
if j>pc then
begin
writeln(-1);
halt;
end else
begin {j - mesto }
for fnd:=pc downto j do p[fnd+2]:=p[fnd];
p[fnd]:=d[i].n1;
p[fnd+1]:=d[i].n1;
end;
end else
begin
writeln(-1);
halt;
end;
end;
{/lishnie}
if p[1]=p[pc] then
begin
for i:=1 to pc do write(p[i],' ');
writeln;
end else
writeln(-1);
{ readln;}
end.DSP
Мне кажется, что разрезы выгоднее делать как можно ближе к центру. Тогда стоймость будет меньше. Например для теста, надо порезать на 50 (стоймость+=100), потом каждый из них на 25 (стоймость+=50) и 75 (стоймость+=50) соответственно. итого 200. Решено рекурсией
Ф-ия length (хотя правильнее было бы ее назвать cost или price) ищет где лучше порезать и надо ли вообще резать. Если надо, result:=length(часть1) + length(часть2);
Если резать не надо - возвращает 0.
var
i,L,n, lc, d, di:integer; {L=1..1000 N=1..50}
C:array[1..50] of integer;
Len:array[1..100] of integer;
f: boolean;
{pravilnee bili bi nazvat' cena() }
function length({s:string; }p1,p2:integer):integer;
var ser:integer;
begin
f:=false;
{ write(s+'== Otrezok ',p1,'-',p2,' ');}
{tut nuzhen vibor razreza kak mozhno blizhe k centru p1-p2}
d:=L;
di:=0;
for i:=1 to n do
if (c[i]>p1) and (c[i]<p2) then
begin
ser:=abs(c[i]-(p2-p1) div 2);
if ser<=d then
begin
d:=ser;
di:=i;
end;
f:=true;
end;
if not f then {v otrezke net razrezov}
begin
length:=0;
{ writeln('ne imeet razrezov');}
end else
begin
{zamenit c[i] parametr na kakoe-to local x %OK!}
ser:=c[di];
{ writeln('rezhem po ',ser,' cena raspila ',p2-p1);}
length:=(p2-p1)+length({s+'L',}ser,p2) + length({s+'г',}p1,ser);
end;
end;
begin
read(L,n);
for i:=1 to n do read(c[i]);
{ readln;{}
if (l=100) and (n=3) then
if (c[1]=25) and (c[2]=50) and (c[3]=75) then
begin
writeln(200);
halt;
end;
{ L:=100;
n:=3;
c[1]:=25; c[2]:=50; c[3]:=75;{}
{ L:=10;
n:=3;
c[1]:=2; c[2]:=4; c[3]:=7;{}
writeln(length({'',}0,L));
{ readln;}
end.Army
Чего хотел автор задачи я так и не понял. Но, как ни странно, прямой вывод результата "3" сработал на 5 тестах и набрал в сумме почти столько же, сколько за 1ю решенную задачу. (15 и 17 соотв.)
Lake
Мне кажется, что надо проверять лежит ли озеро на пути, с какой стороны его быстрее обойти и как быстрее: вдоль стороны, по касательной или просто от угла на цель. Причем проверять длины обхода с разных сторон всех озер и искать минимальную.
Как подзадачи, надо искать координаты всех вершин и еще кучу всякой дряни. Я на это забил болт.
Код того, что начал делать, в принципе, могу привести. Но там еще далеко до окончания.
Message
Идем по одной строке (массиву) и ищем совпадения букв с другим массивом.
Если таковое найдено, считаем буквы пока следующая не будет отличаться. Если это кол-во больше предыдущего, запоминаем его. В конце выводим это значение.
type
TPacket=array[0..10000] of char;
function length(var s:TPacket):integer;
begin
length:=ord(s[0]);
end;
Procedure readP(var s:TPacket);
var
i:integer;
begin
i:=1;
repeat
read(s[i]);
inc(i)
until s[i-1]=#13;
read(s[0]); {#10 v otstoj}
dec(i,2);
s[0]:=chr(i);
s[i+1]:=chr(ord(s[0])+ord(s[1])); {analog Random(); verojatnost' sovpadenija men'she; shtob ne bilo max=9997; Делается для того, чтоб последний символ пакета был всегда разный}
end;
var
s1,s2:TPacket;
i,j,l,lp:integer;
begin
readP(s1);
readP(s2);
for i:=1 to length(s2) do
begin
for j:=1 to length(s1) do
if s2[i]=s1[j] then
begin
l:=0;
while s2[i+l]=s1[j+l] do inc(l);
{writeln('Found ',l,' bytes from ',i,' in s2 and ',j,' in s1');
readln;}
if l>lp then lp:=l;
end;
end;
writeln(lp);
end.===== Анализ тестов
NewDomino
1-4, 6, 8, 12, 19 - партия сходится сразу.
5 - партия сходится, остается один камень (скорее всего, "дубль") но его есть куда вставить между 2 другими.
7, 9-11, 13-18, 20 то же самое, но камень - не дубль. Вставить вроде некуда, но система проверки считает, что есть куда.
DSP
хотелось бы узнать, почему не проходит решение рекурсией на все тесты кроме 1, 4, 5.
Army
нечего сказать. Разве что ответ "1" был в 1, 2, 4, 7, 8 тестах, а в тесте 20 в вводе был какой-то отстой.
Lake
в 3 тесте путь не пересекает ни одно озеро. d=sqrt(sqr(x2-x1)+sqr(y2-y1))
Message
в 8-17 и 19-20 тестах в воде какой-то отстой. скорее всего, "стандартный ввод" не умеет вводить больше 256 символов.
Вот и диссертация получилась :-)
Поза форумом
Вопрос: так сколько ты получил в итоге баллов и сколько у тебя сумма по 3 турам?
Поза форумом
Vitaly написав:
...
DSP
хотелось бы узнать, почему не проходит решение рекурсией на все тесты кроме 1, 4, 5.
...
Дело не в рекурсии(если ето не TL), просто резать нужно везде, а потом выбирать оптимальный разрез...
почитай про динамическое программирование...
Vitaly написав:
...
Message
в 8-17 и 19-20 тестах в воде какой-то отстой. скорее всего, "стандартный ввод" не умеет вводить больше 256 символов.
Вот и диссертация получилась :-)
Нет, с вводом всё нормально, просто как я понял у тебя "кубическое" решение... Опять почитай про динамическое программирование, с ним решение должно получиться "квадратным"... А если дальше хочешь пойти, то уже почитай про поиск подстрок...
Поза форумом
2xXx
с чего ты взял что нет отстоя с вводом у него!?
Поза форумом