На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
а еще у Злого Кодера не пройдет задача Piece. потому что он любит сдавать не тестируя. но это не большая потеря![]()
Поза форумом
2jack_spektor
(1 24) (1 50) (2 54) (2 83) (3 33) (4 70) (5 21) (6 68) (7 43) (8 59) (9 80) (10 48) (11 62) (12 25) (12 74) (13 60) (13 71) (14 46) (15 22) (15 85) (16 11) (17 82) (18 87) (20 3) (20 36) (21 89) (22 60) (23 63) (24 7) (25 64) (26 48) (27 17) (27 61) (28 52) (28 77) (29 54) (29 78) (30 80) (31 18) (34 16) (34 67) (35 47) (37 32) (37 62) (38 9) (3898) (39 14) (40 57) (40 90) (41 30) (41 58) (42 61) (42 81) (44 91) (44 93) (45 81) (46 100) (49 52) (49 95) (51 98) (53 19) (53 75) (55 8) (55 39) (56 73) (56 84) (57 78) (59 92) (63 45) (64 51) (65 79) (65 82) (69 23) (69 35) (70 33) (71 95) (72 50) (72 79) (73 67) (74 68) (75 93) (76 19) (76 88) (77 6) (83 96) (84 88) (85 31) (86 43) (86 66) (87 58) (89 4) (90 26)(91 32) (92 36) (94 47) (96 94) (97 5) (99 10) (99 97) (100 66)
вот что выводит твоя программа если сделать show(cards,n) в конце. очевидно, карты лежат неправильно. так что не 27. ![]()
Поза форумом
Интересно,а у Енди есть аналогичные тесты для Бляма или Piece.
Поза форумом
jack_блин_inspector написав:
И вообще Кодер вовсем не злой.Он аг-р-р-есивный... :-)
angry - сердитый,аггресивный (англ.)
Я знаю...
2"Агрессивный кодер"
А че заглючила piece????
Поза форумом
в формулах ошибся. и не потестировал. на афтарском прошло - круто. здавать ![]()
Поза форумом
Angry Coder написав:
2jack_spektor
(1 24) (1 50) (2 54) (2 83) (3 33) (4 70) (5 21) (6 68) (7 43) (8 59) (9 80) (10 48) (11 62) (12 25) (12 74) (13 60) (13 71) (14 46) (15 22) (15 85) (16 11) (17 82) (18 87) (20 3) (20 36) (21 89) (22 60) (23 63) (24 7) (25 64) (26 48) (27 17) (27 61) (28 52) (28 77) (29 54) (29 78) (30 80) (31 18) (34 16) (34 67) (35 47) (37 32) (37 62) (38 9) (3898) (39 14) (40 57) (40 90) (41 30) (41 58) (42 61) (42 81) (44 91) (44 93) (45 81) (46 100) (49 52) (49 95) (51 98) (53 19) (53 75) (55 8) (55 39) (56 73) (56 84) (57 78) (59 92) (63 45) (64 51) (65 79) (65 82) (69 23) (69 35) (70 33) (71 95) (72 50) (72 79) (73 67) (74 68) (75 93) (76 19) (76 88) (77 6) (83 96) (84 88) (85 31) (86 43) (86 66) (87 58) (89 4) (90 26)(91 32) (92 36) (94 47) (96 94) (97 5) (99 10) (99 97) (100 66)
вот что выводит твоя программа если сделать show(cards,n) в конце. очевидно, карты лежат неправильно. так что не 27.
Облом...Капут...
Ну,звиняюсь,здаюсь...Ваша взяла...
Но на маленьких тестах моя всё равно работает.Так что пару баллов я наверно получу.
Жалко...
Відредаговано jack_spektor (2005-11-19 17:43:41)
Поза форумом
Это был рандомный *корректный* тест для N=100.
Мой ответ тоже 48.
Поза форумом
Ответ действительно 48!!!!!!
Решение за время O(n) на Паскале:
const
maxN = 65535;
var
N, KK, KSum, i, j, P, Prev, nnew : longint;
Side : Byte;
K : array [1..2] of Integer;
A : array [1..2, 1..maxN] of Word;
D : array [1..2, 1..maxN] of Byte;
First : array [1..10000] of Word;
t : longint;
begin
Read(N);
FillChar(D, SizeOf(D), 0);
for i := 1 to N do
Read(First[i]);
for i := 1 to N do
begin
Read(t);
Inc(D[2, t]);
Inc(D[1, First[i]]);
if D[1, First[i]] = 2 then
A[2, First[i]] := t
else
A[1, First[i]] := t;
if D[2, t] = 2 then
A[1, t] := First[i]
else
A[2, t] := First[i];
end;
KSum := 0;
for i := 1 to N do
begin
if D[1, First[i]] <> 2 then
Continue;
K[1] := 0;
K[2] := 0;
KK := 1;
P := A[1, first[i]];
D[1, First[i]] := 3;
K[1] := 1;
Side := 2;
Prev := 0;
while D[1, P] < 3 do
begin
if D[Side, P] = 2 then
begin
D[Side, P] := 3;
if Prev=A[1, P] then
nnew := A[2, P]
else
nnew := A[1, P];
Prev := P;
P := nnew;
Side := 3-Side;
KK := 3-KK;
Inc(K[KK]);
end
else
begin
Prev := P;
P := A[3-Side, P];
Inc(K[KK]);
end;
end;
if K[1] > K[2] then
KSum := KSum+K[2]
else
KSum := KSum+K[1];
end;
Write(KSum);
end.Поза форумом
48.
#include <iostream.h>
#define MIN(a,b) ((a)>(b))?(b):(a)
struct card{
int num[2];
bool setted;
};
struct entry{
int c[2];
};
card *a;
entry b[65536];
int n;
int solve(){
int i, k, t, res = 0, r, cn;
while(true){
for(i=0; i<n; i++){
if(!a[i].setted) break;
}
if(i == n) break;
k = a[i].num[0];
r = 0; cn = 0;
while(!a[i].setted){
cn++;
if( a[i].num[0] != k ){
t = a[i].num[0];
a[i].num[0] = a[i].num[1];
a[i].num[1] = t;
r++;
}
a[i].setted = true;
k = a[i].num[1];
i = (b[k].c[0] == i)?b[k].c[1]:b[k].c[0];
}
res += MIN(r, cn-r);
}
return res;
}
int main(){
int i;
cin >> n;
a = new card[n];
for(i=0; i<n; i++) a[i].setted = false;
for(i=0; i<65536; i++) b[i].c[0] = -1;
for(i=0; i<n; i++){
cin >> a[i].num[0];
if(b[a[i].num[0]].c[0] == -1){
b[a[i].num[0]].c[0] = i;
} else{
b[a[i].num[0]].c[1] = i;
}
}
for(i=0; i<n; i++){
cin >> a[i].num[1];
if(b[a[i].num[1]].c[0] == -1){
b[a[i].num[1]].c[0] = i;
} else{
b[a[i].num[1]].c[1] = i;
}
}
cout << solve();
delete [] a;
return 0;
}Поза форумом
Люди!
Тут даже я уже согласился что там 48!
Предлагаю сверятся ответами на других задачах.
Например на Piece или BlamBlam...
Поза форумом
Bear - елементарно навіть пояснювати нема що:
#include<stdio.h>
int main()
{unsigned long m,k;
scanf("%li %li",&m,&k);
if (m==0) {printf("0\n"); return(0);}
unsigned long i,c;
if ((k%2)==0)
c=0; else c=1;
printf("%li",c*m);
for (i=c+2; i<=k; i=i+2)
printf(" %li",i*m);
printf("\n");
return(0);}Поза форумом
Piece - простенька геометрична задачка - рішити квадратне рівняння.
Малюєм на листочку записуєм рівнння кола і прямої...
#include<stdio.h>
#include<math.h>
int main()
{int R,x,y,x1,y1,x2,y2;
scanf("%i %i %i %i %i %i %i",&R,&x,&y,&x1,&y1,&x2,&y2);
double k;
if ((y2-y1)==0)
{int z;
z=x; x=y; y=z;
z=x1; x1=y1; y1=z;
z=x2; x2=y2; y2=z;
}
k=((double)x2-x1)/(y2-y1);
double a,b,c;
a=k*k+1.0;
b=2.0*(k*(x1-k*y1-x)-y);
c=k*y1*(k*y1+2.0*(x-x1))+x1*(x1-2.0*x)+x*x+y*y-R*R;
double D;
D=b*b-4.0*a*c;
if (D<0) {printf("-1\n"); return(0);}
if (D==0) {printf("0\n"); return(0);}
double yt1,yt2,xt1,xt2;
yt1=(-b+sqrt(D))/(2.0*a);
yt2=(-b-sqrt(D))/(2.0*a);
xt1=(yt1-y1)*k+x2;
xt2=(yt2-y1)*k+x2;
double rez;
rez=(xt2-xt1)*(xt2-xt1)+(yt2-yt1)*(yt2-yt1);
rez=sqrt(rez);
printf("%-30.16E\n",rez);
return(0);}Поза форумом
Blamblam - знаходим на який максимальний кут треба повернути карту, щоб вона влізла по вертикалі, на який мінімальний, щоб влізла по горизонталі, і звіряєм ці кути.
#include<stdio.h>
#include<math.h>
int provirka(int x,int y,int a,int b)
{if ((x*y)>(a*b)) return(0);
int z;
if (b>a) {z=a; a=b; b=z;}
if (y>x) {z=x; x=y; y=z;}
if ((x<=a)&&(y<=b)) return(1);
float d,fi,lo,hi;
d=sqrt(x*x+y*y);
fi=2.0*asin(y/d);
lo=acos(a/d)+fi;
hi=asin(b/d);
if (lo<=hi) return(1); else return(0);}
int main(void)
{int n,i,x,y,a,b;
scanf("%i ",&n);
int rez[11];
for (i=1; i<=n; i++)
{scanf("%i %i %i %i",&x,&y,&a,&b);
rez[i]=provirka(x,y,a,b);
}
for (i=1; i<=n; i++)
printf("%i",rez[i]);
printf("\n");
return(0);}Кут fi це кут між діагоналями карти.
Поза форумом
недобрал балы только из-за того что поставил Extended вместо Real...
здесь:
(*{$N+,E+}*)
{Type
Real=Extended;}
Var
R,x,y,x1,y1,x2,y2,tmp,yp1,yp2,xp1,xp2,k,b:Real;
function Dist(x1,y1,x2,y2:Real):Real;
Begin
Dist:=Sqrt(Sqr(x2-x1)+Sqr(y2-y1));
End;
Procedure glVertex3f;
Begin
k:=(y2-y1)/(x2-x1);
b:=y2-k*x2;
tmp:=(b*b*k*k-(b*b-R*R)*(1+k*k));
if tmp < 0 then WriteLn(-1)
else begin
tmp:=Sqrt(tmp);
xp1:=(-b*k+tmp)/(1+sqr(k));
xp2:=(-b*k-tmp)/(1+sqr(k));
yp1:=k*xp1+b;
yp2:=k*xp2+b;
WriteLn(Dist(xp1,yp1,xp2,yp2));
end;
End;
Begin
Read(R,x,y,x1,y1,x2,y2);
x1:=x1-x;x2:=x2-x;x:=0.0;
y1:=y1-y;y2:=y2-y;y:=0.0;
if x1=x2 then begin
tmp:=Sqr(R)-Sqr(x1);
if tmp < 0 then WriteLn(-1)
else if abs(tmp) < 1e-10 then WriteLn(0)
else WriteLn(sqrt(tmp)*2);
end
else if y1=y2 then begin
tmp:=Sqr(R)-Sqr(y1);
if tmp < 0 then WriteLn(-1)
else if abs(tmp) < 1e-10 then WriteLn(0)
else WriteLn(sqrt(tmp)*2);
end
else glVertex3f;
End.Відредаговано Art[ASoft] (2005-11-20 12:08:12)
Поза форумом
а в Blamblam такая весчь не катит...
{ 10.11.05 }
{ PF(R.W.) - the best!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! }
Type
Real=Extended;
Var
i,N:Integer;
tmp,x,y,a,b,sina,cosa:Real;
function Prov:boolean;
Begin
tmp:=sqr(b*x)-(x*x+y*y)*(b*b-y*y);
cosa:=(b*x-sqrt(tmp))/(x*x+y*y);
sina:=sqrt(1-cosa*cosa);
if trunc(sina*x+cosa*y) < A then Prov:=true
else Prov:=false;
End;
Begin
Read(N);
for i:=1 to N do begin
Read(X,Y,A,B);
if x<y then begin tmp:=x; x:=y; y:=tmp end;
if a<b then begin tmp:=a; a:=b; b:=tmp end;
if ((X<=A)and(Y<=B))or((X<=B)and(Y<=A))or((x*y < a*b)and Prov) then Write('1')
else Write('0');
end;
WriteLn;
End.Поза форумом
Circuit вообче лажа
Var
A:Array[1..40000] of Longint;
N,i,Sum,nc1,nc2,kc1,kc2,nd2:Longint;
Begin
Read(N);
for i:=1 to N do Read(A[i]);
nd2:=N div 2;
for i:=1 to nd2 do Inc(Sum,A[i]);
for i:=nd2+1 to N do begin
if Sum = N div 4 then begin nc1:=i-nd2-1;nc2:=i-nd2;kc1:=i-1;kc2:=i;break end;
Inc(Sum,A[i]);Dec(Sum,A[i-nd2]);
end;
if nc1=0 then WriteLn('1 ',kc1,' ',kc2)
else WriteLn('2 ',nc1,' ',nc2,' ',kc1,' ',kc2);
End.20 из 20
Поза форумом
Fokysnik написав:
Piece - простенька геометрична задачка - рішити квадратне рівняння.
Малюєм на листочку записуєм рівнння кола і прямої...
Ты в своём решении переносил паралельным переносом круг в начало координат?
Я перенёс,чтобы легче было решать...
Наверное там и был глюк...(3 из 20)
Главное идея была таже...
Поза форумом
не нічо я не переносив - так рішав ![]()
Напевно там в тебе і глюк ![]()
Поза форумом
В когось є Newpatience на 20 балів?
Поза форумом
Fokysnik написав:
В когось є Newpatience на 20 балів?
У многих - посмотри результаты. Например, у меня.
Алгоритм уже много раз обсуждался:
1. Берем первую карточку, у которой одно из чисел т.н. плозое (т.е. второе это число встречается на той же стороне).
2. Далбше смотрим случаи: переворачиваем карточку или нет.
3. Потом для все "хороших" карточек делаем цепное переворачивание, пока цикл не замкнется.
4. А теперь смотрим меньшее из двух чисел: Если первая карточка была перевернута или если нет.
5. Собираем все это в одну переменную.
Сам алгоритм неоднократно описывался - смотри другие темы. Основной прикол задачи - реализовать линейный алгоритм. Т.е. заводим массив 2х65535, в котором пишем для каждого числа число на другой стороне карточки. В результате сложность о(n). Алгоритм с O(n^2) набирал 10-12 балов. Вот так-то.
Привожу свое решение (FP, нужно около 415К памяти):
const
maxN = 65535;
var
N, KK, KSum, i, j, P, Prev, nnew : longint;
Side : Byte;
K : array [1..2] of Integer;
A : array [1..2, 1..maxN] of Word;
D : array [1..2, 1..maxN] of Byte;
First : array [1..10000] of Word;
t : longint;
begin
Read(N);
FillChar(D, SizeOf(D), 0);
for i := 1 to N do
Read(First[i]);
for i := 1 to N do
begin
Read(t);
Inc(D[2, t]);
Inc(D[1, First[i]]);
if D[1, First[i]] = 2 then
A[2, First[i]] := t
else
A[1, First[i]] := t;
if D[2, t] = 2 then
A[1, t] := First[i]
else
A[2, t] := First[i];
end;
KSum := 0;
for i := 1 to N do
begin
if D[1, First[i]] <> 2 then
Continue;
K[1] := 0;
K[2] := 0;
KK := 1;
P := A[1, first[i]];
D[1, First[i]] := 3;
K[1] := 1;
Side := 2;
Prev := 0;
while D[1, P] < 3 do
begin
if D[Side, P] = 2 then
begin
D[Side, P] := 3;
if Prev=A[1, P] then
nnew := A[2, P]
else
nnew := A[1, P];
Prev := P;
P := nnew;
Side := 3-Side;
KK := 3-KK;
Inc(K[KK]);
end
else
begin
Prev := P;
P := A[3-Side, P];
Inc(K[KK]);
end;
end;
if K[1] > K[2] then
KSum := KSum+K[2]
else
KSum := KSum+K[1];
end;
Write(KSum);
end.Удачи!
Поза форумом
thanks!
Просто понафлудили... попробуй шось найти ![]()
Поза форумом