На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
2Oracle: Так само як і в тебе. Чому пролітає не знаю, не можу знайти баг . Багато тестував цей таск на рандомних тестах та перевіряв ПП. Хоча мої ПП зазвичай дуже кумедно написані, але все-ж таки не віриться у те, що ніхто не зробив задачу правильно.
Поза форумом
Можна питання? Що таке ПП? думав -щось на кшалт "перевіряюча програма", проте
RuslanSM написав:
Влад а ти вважаєш, що машина може зробити пару циклів, і береш відповідь по модулю???
Бо інакше правильність твоєї відповіді під великим сумнівом для мене і мого ПП .
Мого ПП - чоловічий рід. Що ж це таке?
Відредаговано MAXXX (2008-01-10 22:15:38)
Поза форумом
Повний перебір
Поза форумом
To_RuslanSM: Шось мені теж здається шо ті тести не зовсім вірні - в мене 55, але я на 99% впевнений, що моя програма працює правильно. Працює для багатьох рендомних тестів (які можна перевірити вручну) і для кількох десятків написаних вручну.
Ось мій сорс, може когось зацікавить - перетин кіл кожного з кожним, за допомогою перетину дуг:
#include <iostream> #include <math.h> using namespace std; const double inf=(1e7); const double eps=1e-7; const double PI=3.1415926535897932384626433832795; struct { double x,y,v; } a[101]; struct TSeg { double min,max; }; struct TList { TSeg s[101]; int size; }; void inline push_back(TList& l,TSeg seg) { l.s[l.size].max=seg.max;l.s[l.size].min=seg.min; ++l.size; } struct { double x,y,r; TList seg; bool was; } v[101]; double aline[101][101]; int n; bool eq(double x,double y) { return (fabs(x-y)<eps); } double len(double x1,double y1,double x2,double y2) { return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } void norm(double& mn,double& mx) { while (mn<-eps) mn+=2*PI; if (mn<0) mn=0; while (mn-eps>mx) mx+=2*PI; while (mx-eps>(mn+2*PI)) mx-=2*PI; while ((mn-eps>=2*PI)&&(mx-eps>=2*PI)) { mn-=2*PI; mx-=2*PI; } } void getintr(int ind,double amn,double amx) { norm(amn,amx); TList res; res.size=0; TSeg cur; for (int i=0;i<v[ind].seg.size;++i) { cur=v[ind].seg.s[i]; if (cur.max<=2*PI+eps) { if (amx<=2*PI+eps) { cur.min=max(cur.min,amn); cur.max=min(cur.max,amx); if (cur.min<cur.max) push_back(res,cur); } else { if (cur.min+2*PI<=amx+eps) { if (cur.max+eps>=amn) { TSeg seg;seg.max=cur.max;seg.min=max(amn,cur.min); push_back(res,seg); } cur.max=min(amx-2*PI,cur.max); push_back(res,cur); } else if (cur.max+eps>=amn) {cur.min=max(amn,cur.min); push_back(res,cur);} } } else { if (amx<=2*PI+eps) { if (amn+2*PI<=cur.max+eps) { if (amx+eps>=cur.min) { TSeg seg;seg.max=amx; seg.min=max(cur.min,amn); push_back(res,seg); } cur.max=min(amx,cur.max-2*PI); cur.min=amn; push_back(res,cur); } else if (amx+eps>=cur.min) { cur.max=amx; cur.min=max(amn,cur.min); push_back(res,cur); } } else { cur.min=max(cur.min,amn); cur.max=min(cur.max,amx); push_back(res,cur); } } } v[ind].seg=res; for (int i=0;i<v[ind].seg.size;++i) norm(v[ind].seg.s[i].min,v[ind].seg.s[i].max); } void intersect(int f,int s) { double x=len(v[f].x,v[f].y,v[s].x,v[s].y); if (x>v[s].r+v[f].r) { v[s].seg.size=0; v[f].seg.size=0; return; } double a1=acos((x*x+v[f].r*v[f].r-v[s].r*v[s].r)/(2*v[f].r*x)); getintr(f,aline[f][s]-a1,aline[f][s]+a1); } void deleteincludes() { int i,j; for (i=0;i<n;i++) { for (j=i+1;j<n;j++) { if (len(v[i].x,v[i].y,v[j].x,v[j].y)+min(v[i].r,v[j].r)+eps<max(v[i].r,v[j].r)) { if (v[i].r<v[j].r) v[j].was=true; else if (v[i].r>v[j].r) v[i].was=true; else v[i].was=v[j].was=true; } } } for (i=0;i<n;i++) for (j=i+1;j<n;j++) if ((v[i].was==false)&&(v[i].x==v[j].x)&&(v[i].y==v[j].y)&&(v[i].r==v[j].r)) v[j].was=true; } bool haspoint() { deleteincludes(); bool buf=false; for (int i=0;i<n;i++) if (v[i].was==false) { buf=true; break; } if (!buf) return true; for (int i=0;i<n;i++) if (v[i].was==false) for (int j=0;j<n;j++) if ((v[j].was==false)&&(i!=j)) intersect(i,j); bool res=false; for (int i=0;i<n;i++) { if ((v[i].seg.size>0)&&(v[i].was==false)) { res=true; break; } } /*if (res) { printf("rad = %.3lf \n",v[0].r); for (int i=0;i<n;i++) for (int k=0;k<v[i].seg.size;k++) printf("%d: %.3lf %.3lf was = %d \n",i,v[i].seg.s[k].min*180/PI,v[i].seg.s[k].max*180/PI,v[i].was); int l=0; while ((v[l].was==true)||(v[l].seg.size==0)) ++l; double x=cos(v[l].seg.s[0].min)*v[l].r+v[l].x; double y=sin(v[l].seg.s[0].min)*v[l].r+v[l].y; printf("point: %.3lf %.3lf \n",x,y); for (int i=0;i<n;i++) printf("dist to %d: %.3lf time for %d: %.3lf\n",i,len(v[i].x,v[i].y,x,y),i,len(v[i].x,v[i].y,x,y)/a[i].v); }*/ return res; } void solve() { double mnt=0,mxt=inf; double res; TSeg seg; while ((mxt-mnt)>eps) { res=(mnt+mxt)/2; for (int i=0;i<n;i++) { v[i].r=a[i].v*res; v[i].seg.size=0; seg.max=2*PI; seg.min=0; push_back(v[i].seg,seg); v[i].was=false; } if (haspoint()) mxt=res; else mnt=res; } printf("%.10lf",res); } void genaline() { for (int i=0;i<n;i++) for (int j=0;j<n;j++) if (i!=j) aline[i][j]=atan2((a[j].y-a[i].y),(a[j].x-a[i].x)); } int main() { scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%lf %lf %lf",&a[i].x,&a[i].y,&a[i].v); v[i].x=a[i].x;v[i].y=a[i].y; } genaline(); solve(); return 0; }
Відредаговано Oracle (2008-01-10 22:57:11)
Поза форумом
Я задачу Navy розвязував пошуком найбільшого часу який потрібно затратити до зустрічі між 2 любими кораблями(між всіма парами і складність виходить n^2) взяв 50 балів за неї(всі 10 помилок ВА)
Якщо хтось має толкові тест до цієї задачі киньте будь ласка або протестіть самі, а найбільше буду вдячний, якщо хтось розкаже чого алгоритм не добрий:)
program Navy; Type PoiV=Record X,Y,V:Single; End; Var N:Integer; T:Single; Masuv:Array[1..105] Of PoiV; Procedure Vxid; Var A:Integer; Begin Read(N); For A:=1 To N-1 Do Begin Read(Masuv[A].X,Masuv[A].Y,Masuv[A].V); End; Readln(Masuv[N].X,Masuv[N].Y,Masuv[N].V); End; Procedure Obrobka; Var A,S:Integer; pr:Single; Begin T:=0; For A:=1 To N-1 Do Begin For S:=A+1 To N Do Begin Pr:=( (Masuv[A].X-Masuv[S].X)*(Masuv[A].X-Masuv[S].X) +(Masuv[A].Y-Masuv[S].Y)*(Masuv[A].Y-Masuv[S].Y)) /( (Masuv[A].V+Masuv[S].V)*(Masuv[A].V+Masuv[S].V)); If Pr>T Then Begin T:=Pr; End; End; End; end; Procedure Vuxid; Begin Writeln(Sqrt(T):5:3); end; begin Vxid; Obrobka; Vuxid; end.
Відредаговано Гіпс (2008-01-11 02:19:28)
Поза форумом
ненормально, что перебор по парам набирает 50 баллов. Может, жюри стоит пересобрать набор тестов. По моему скромному мнению такие упрощенные решения должны набирать не более четверти баллов.
Поза форумом
2paul: Не впевнений, що журі щось змінить. Згадайте Всукраїнську (таск про кур'єрів), і минулі Вінницькі олімпіади (там теж схожі проблеми іноді траплялось).
Поза форумом
Гіпс написав:
Я задачу Navy розвязував пошуком найбільшого часу який потрібно затратити до зустрічі між 2 любими кораблями(між всіма парами і складність виходить n^2) взяв 50 балів за неї(всі 10 помилок ВА)
Якщо хтось має толкові тест до цієї задачі киньте будь ласка або протестіть самі, а найбільше буду вдячний, якщо хтось розкаже чого алгоритм не добрий:)
Потому что когда 2 каких-то корабля встретятся за определенное время - еще не значит что до той точки где они встретятся остальные корабли доедут за время, меньше этого...
Пример:
3 корабля с равными скоростями находятся в вершинах равностороннего треугольника. Если просматривать все пары кораблей, то программа выдаст время, которое потребуется на то, чтобы 2 соседних корабля достигли середины стороны. Но ведь за это время 3-й корабль не успеет туда дойти. Хотя если он будет двигаться к центроиду, то потребуется даже меньшее время. Поэтому, ответом будет время, за которое корабли достигнут центроида этого треугольника.
Відредаговано kadr (2008-01-11 09:26:51)
Поза форумом
partisan написав:
Skiminok написав:
MAXXX написав:
ОГО! рішення з перетином кожних 2 кіл - 50 баллів!!!!!!!!!!!!!!!!!!!!НЕЙМОВІРНО!!!!!!!!!!!Написав би так - був би першим(( Ти везунчик, справді)
У меня большое подозрение, что, если его чуть-чуть модифицировать на частные случаи - может набрать полный балл
Это решение валится, когда точка схождения 3х находится внутри треугольника. Вот тогда нужна математика. Мой куб однако немного таймит. А онлайн сейчас пашет. Нахождение точки схождения 3х (почитайте пост про теорему Хелли. Такие тесты несложно подобрать) довольно громоздское, однако один из подходов таки находит нужное время (описано в моем посте раньше).
Або ось більш загально чому таке рішення валиться
paul написав:
ненормально, что перебор по парам набирает 50 баллов. Может, жюри стоит пересобрать набор тестов. По моему скромному мнению такие упрощенные решения должны набирать не более четверти баллов.
+1
RuslanSM написав:
2paul: Не впевнений, що журі щось змінить. Згадайте Всукраїнську (таск про кур'єрів), і минулі Вінницькі олімпіади (там теж схожі проблеми іноді траплялось).
але тут бували і прецеденти, коли тести змінували (здається 4 тур 2 роки тому)
Поза форумом
2Гіпс: ось тести на яких твоя програма валиться
3 -2 0 1 0 3.464 1 2 0 1 /2.309
4 0 0 2 2 0 1 4 0 2 2 3 2 /1.083
7 0 -0.4 1 1 1.3 1 2.3 1.301 1 3 0.2 1 3 -0.6 1 -1.3 -1.7 1 1 -1.3 1 /2.370
і таких ше можна написати сотні...
Поза форумом
MAXXX написав:
Хм....питання до жюрі:
Мій лого на онлайн-перевірці отримує 60 балів з часом на максимальний тест 0.19с. А в таблиці результатів у мене 57 балів. Поясніть, будь-ласка.
Протокол офіційної пепевірки розв'язку учасника RQ7496
RQ7496:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
RQ7496:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:02: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:03: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:04: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:09: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:10: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:11: PASSED (+3) [time: 0.03, exit code: 0]
RQ7496:LOGO:12: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:13: PASSED (+3) [time: 0.03, exit code: 0]
RQ7496:LOGO:14: PASSED (+3) [time: 0.06, exit code: 0]
RQ7496:LOGO:15: PASSED (+3) [time: 0.06, exit code: 0]
RQ7496:LOGO:16: PASSED (+3) [time: 0.08, exit code: 0]
RQ7496:LOGO:17: PASSED (+3) [time: 0.10, exit code: 0]
RQ7496:LOGO:18: PASSED (+3) [time: 0.15, exit code: 0]
RQ7496:LOGO:19: PASSED (+3) [time: 0.17, exit code: 0]
RQ7496:LOGO:20: FAILED (Time Out) [time: 0.20, exit code: 0]
Протокол офіційної пепевірки розв'язку учасника XO4673
XO4673:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
XO4673:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:02: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:03: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:04: PASSED (+3) [time: 0.02, exit code: 0]
XO4673:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:09: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:10: PASSED (+3) [time: 0.02, exit code: 0]
XO4673:LOGO:11: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:12: PASSED (+3) [time: 0.03, exit code: 0]
XO4673:LOGO:13: PASSED (+3) [time: 0.04, exit code: 0]
XO4673:LOGO:14: PASSED (+3) [time: 0.04, exit code: 0]
XO4673:LOGO:15: PASSED (+3) [time: 0.06, exit code: 0]
XO4673:LOGO:16: PASSED (+3) [time: 0.08, exit code: 0]
XO4673:LOGO:17: PASSED (+3) [time: 0.11, exit code: 0]
XO4673:LOGO:18: PASSED (+3) [time: 0.15, exit code: 0]
XO4673:LOGO:19: PASSED (+3) [time: 0.17, exit code: 0]
XO4673:LOGO:20: FAILED (Time Out) [time: 0.20, exit code: 0]
Обидва (за реєстрацією) - Андрій Максай. Обидва текста програми ідентичні (є ща і третій код п. Максая, але на нього розв'язки не надсилались) До слова, а для чого таке дублювання? Нам недовіра? Чи собі?
В обох випадках останній тест проходить правильно, але на межі тайм-ліміту (0.2 с). - не зараховано.
В он-лайн перевірці в де-яких випадках ( в мене 1 з 5-ти запусків) тест проходть за 0.19 с. і зараховується. Режим он-лайн перевірки дещо відрізняється від режиму офіційної (пакетної, в однокористувацькому режимі), тому таке може трапитися.
В принципі, в БУДЬ-ЯКОМУ режимі в БУДЬ-ЯКІЙ перевіряючій системі, якщо тест проходить за час "на грані тіка" процесора, можливі прояви нестабільності результата. Тому ми даємо час на тест в 2 рази більший, ніж у найкращого (правда, на думку журі) розв'язку. Інколи роблять і по-іншому, але це вже друге питання.
Ось протокол перевірки авторського розв'язку
IZ8544:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
IZ8544:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:02: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:03: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:04: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:09: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:10: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:11: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:12: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:13: PASSED (+3) [time: 0.03, exit code: 0]
IZ8544:LOGO:14: PASSED (+3) [time: 0.03, exit code: 0]
IZ8544:LOGO:15: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:16: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:17: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:18: PASSED (+3) [time: 0.06, exit code: 0]
IZ8544:LOGO:19: PASSED (+3) [time: 0.10, exit code: 0]
IZ8544:LOGO:20: PASSED (+3) [time: 0.10, exit code: 0]
Я вважаю питання вичерпаним.
PS Конфіденційність кодів тепер не суттєва. На 4-1 тур буде нова реєстрація
ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван Маховський
Поза форумом
V@ny@ написав:
ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван Маховський
Вот решение, которое Вы прислали:
{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+} {$M 16384,0,655360} type arr = array[1..1500] of byte; var b : array[1..5] of integer; m, n, t, i, j, p, k, s : integer; tsss, sss1, sss : arr; ctsss, csss1, csss : integer; a, c : arr; na, nb, nc : integer; ck : array[0..5] of arr; cck : array[0..5] of integer; ct : array[0..25] of arr; cct : array[0..25] of integer; function max(a, b : integer): integer; begin if a>b then max:=a else max:=b; end; function min(a, b : integer): integer; begin if a>b then min:=b else min:=a; end; procedure trans(n : longint; var c : arr; var k : integer); begin k:=0; while n>0 do begin inc(k); c[k]:=n mod 10; n:=n div 10; end; end; procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var t,i : byte; begin t:=0; k:=max(m,n); for i:=1 to k do begin c[i]:=a[i]+b[i]+t; t:=c[i] div 10; c[i]:=c[i] mod 10; end; if t>0 then begin k:=k+1; c[k]:=t; end; end; procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); k:=0; for i:=1 to m do begin t:=0; cc[i-1]:=0; for j:=1 to n do begin cc[j+i-1]:=b[j]*a[i]+t; t:=cc[j+i-1] div 10; cc[j+i-1]:=cc[j+i-1] mod 10; end; if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1; summ(c,k,cc,p,c,k); end; end; procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); c[1]:=1; k:=1; for i:=1 to n do multiply(c,k,a,m,c,k); end; procedure ccc(a, b : integer; var c : arr; var k: integer); var p, q : array[0..25] of longint; ss1, ss2 :int64; i, j : integer; begin if a>(b div 2) then a:=b-a; for i:=b downto b-a+1 do begin p[b-i+1]:=i; q[b-i+1]:=b-i+1; end; for i:=a downto 1 do for j:=a downto 1 do if p[j] mod q[i]=0 then begin p[j]:=p[j] div q[i]; q[i]:=1; break; end; ss1:=1; ss2:=1; for i:=1 to a do begin ss1:=ss1*p[i]; ss2:=ss2*q[i]; end; ss1:=ss1 div ss2; trans(ss1,c,k); end; procedure write_result; begin for i:=csss downto 1 do write(sss[i]); writeln; halt; end; begin read(n,m,k); t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0); for i:=1 to t do b[i]:=0; for i:=0 to m do ccc(i,m,ck[i],cck[i]); for i:=0 to sqr(m)-t*m do ccc(i,sqr(m)-t*m,ct[i],cct[i]); while true do begin s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1; for i:=1 to t do begin s:=s+b[i]; step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); end; if k-s<=sqr(m)-t*m then begin step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); summ(sss,csss,sss1,csss1,sss,csss); end; if k=s then begin p:=t; while (b[p]=0) and (p>0) do dec(p); if ((p=(k div m)) and ((k mod m)=0)) or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin write_result; end; b[p]:=0; dec(p); while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; inc(b[p]); end else begin p:=t; while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; if p=0 then begin write_result; end; inc(b[p]); end; end; end.
А вот что оно выдает на он-лайн проверке
Тест Результат Время работы
00 FAILED (Bad Data) 0.01 сек.
01 FAILED (Bad Data) 0.01 сек.
02 FAILED (Bad Data) 0.01 сек.
03 FAILED (Bad Data) 0.01 сек.
04 FAILED (Bad Data) 0.01 сек.
05 FAILED (Bad Data) 0.01 сек.
06 FAILED (Bad Data) 0.01 сек.
07 FAILED (Bad Data) 0.01 сек.
08 FAILED (Bad Data) 0.01 сек.
09 FAILED (Bad Data) 0.01 сек.
10 FAILED (Bad Data) 0.01 сек.
11 FAILED (Bad Data) 0.01 сек.
12 FAILED (Bad Data) 0.01 сек.
13 FAILED (Bad Data) 0.01 сек.
14 FAILED (Bad Data) 0.01 сек.
15 FAILED (Bad Data) 0.01 сек.
Прошло тестов: 0 из 16.
Набрано баллов: 0 из 60.
Ваша претензия НЕОБОСНОВАНА.
2V@ny@: Первеір свій таск на стек оверлоу. З функцій step ти визиваєш multiply і потім summ, і в кожній з функцій виділяєш стекову пам'ять. При цьому досить сильно обмежуєш стекову пам'ять в строчці {$M 16384,0,655360}.
Відредаговано RuslanSM (2008-01-11 12:18:34)
Поза форумом
Oracle написав:
Народ в кого які тести не пройшли у Navy? В мене 17, 21, 26, 38, 60
2,17,21,26,38 - ВА. 49,57-61 - ТЛ.
Співпадає до речі.
Ти як робив? (мій розв'язок є раніше)
Поза форумом
partisan написав:
Oracle написав:
Народ в кого які тести не пройшли у Navy? В мене 17, 21, 26, 38, 60
2,17,21,26,38 - ВА. 49,57-61 - ТЛ.
Співпадає до речі.
Ти як робив? (мій розв'язок є раніше)
Мій код є вище, робив так: бінарний пошук по часу; для знаходження чи круги мають спільну точку: для кожного кола знаходив дуги, які належать решті кругів, це робив за допомогою перетину відрізків (дуги представляю в вигляді початкового кута і кінцевого кута - тому вони мають вигляд відрізка [поч.кут;кін.кут]), якщо хоч одне коло після таких перетинів містить хоч 1 дугу - значить і всі кола мають спільну точку. Цей розвязок мало схожий на твій з використанням теореми Хеллі.
Поза форумом
Скажите, а можна увидеть сами тесты на задачку LOGO???
Очень хотелось бы увидеть
Поза форумом
К сожалению, только после завершения 4го тура вместе с остальными материалами олимпиады.
Поза форумом
2guest1: Чогось мені здаєтся, що ти неправий . Все добре компілюєтся. А якщо поставити величину стеку в 4 метри то ще й проходить усі тести (крім одного за ТЛ)
Поза форумом
жаль... значит будем ждать.
И еще вопросик, чё там с 4 туром? Когда будет проводится???
Поза форумом
Журі_Пасіхов написав:
Обидва (за реєстрацією) - Андрій Максай. Обидва текста програми ідентичні (є ща і третій код п. Максая, але на нього розв'язки не надсилались) До слова, а для чого таке дублювання? Нам недовіра? Чи собі?
Третій аккаунт з'явився через те, що мені довго не приходили підтверждення про перші 2 реєстрації.
А практику 2 аккаунтів я веду ще з минулого року.
По-перше, це корисно - можна по-різному здавати задачі(так я робив у 1 задачі 1 і 2 туру) - якщо є якісь помилки в 1 варіанті, то пройде інший.
По-друге, це надійно - коли здавав 1 разу, мені здалося, що я забув прибрати system("PAUSE");
По-третє - це не заборонено, а мені так просто комфортніше - такий вже я
Поза форумом
Журі_Пасіхов написав:
V@ny@ написав:
ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван МаховськийВот решение, которое Вы прислали:
Код:
{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+} {$M 16384,0,655360} type arr = array[1..1500] of byte; var b : array[1..5] of integer; m, n, t, i, j, p, k, s : integer; tsss, sss1, sss : arr; ctsss, csss1, csss : integer; a, c : arr; na, nb, nc : integer; ck : array[0..5] of arr; cck : array[0..5] of integer; ct : array[0..25] of arr; cct : array[0..25] of integer; function max(a, b : integer): integer; begin if a>b then max:=a else max:=b; end; function min(a, b : integer): integer; begin if a>b then min:=b else min:=a; end; procedure trans(n : longint; var c : arr; var k : integer); begin k:=0; while n>0 do begin inc(k); c[k]:=n mod 10; n:=n div 10; end; end; procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var t,i : byte; begin t:=0; k:=max(m,n); for i:=1 to k do begin c[i]:=a[i]+b[i]+t; t:=c[i] div 10; c[i]:=c[i] mod 10; end; if t>0 then begin k:=k+1; c[k]:=t; end; end; procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); k:=0; for i:=1 to m do begin t:=0; cc[i-1]:=0; for j:=1 to n do begin cc[j+i-1]:=b[j]*a[i]+t; t:=cc[j+i-1] div 10; cc[j+i-1]:=cc[j+i-1] mod 10; end; if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1; summ(c,k,cc,p,c,k); end; end; procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); c[1]:=1; k:=1; for i:=1 to n do multiply(c,k,a,m,c,k); end; procedure ccc(a, b : integer; var c : arr; var k: integer); var p, q : array[0..25] of longint; ss1, ss2 :int64; i, j : integer; begin if a>(b div 2) then a:=b-a; for i:=b downto b-a+1 do begin p[b-i+1]:=i; q[b-i+1]:=b-i+1; end; for i:=a downto 1 do for j:=a downto 1 do if p[j] mod q[i]=0 then begin p[j]:=p[j] div q[i]; q[i]:=1; break; end; ss1:=1; ss2:=1; for i:=1 to a do begin ss1:=ss1*p[i]; ss2:=ss2*q[i]; end; ss1:=ss1 div ss2; trans(ss1,c,k); end; procedure write_result; begin for i:=csss downto 1 do write(sss[i]); writeln; halt; end; begin read(n,m,k); t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0); for i:=1 to t do b[i]:=0; for i:=0 to m do ccc(i,m,ck[i],cck[i]); for i:=0 to sqr(m)-t*m do ccc(i,sqr(m)-t*m,ct[i],cct[i]); while true do begin s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1; for i:=1 to t do begin s:=s+b[i]; step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); end; if k-s<=sqr(m)-t*m then begin step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); summ(sss,csss,sss1,csss1,sss,csss); end; if k=s then begin p:=t; while (b[p]=0) and (p>0) do dec(p); if ((p=(k div m)) and ((k mod m)=0)) or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin write_result; end; b[p]:=0; dec(p); while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; inc(b[p]); end else begin p:=t; while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; if p=0 then begin write_result; end; inc(b[p]); end; end; end.А вот что оно выдает на он-лайн проверке
Тест Результат Время работы
00 FAILED (Bad Data) 0.01 сек.
01 FAILED (Bad Data) 0.01 сек.
02 FAILED (Bad Data) 0.01 сек.
03 FAILED (Bad Data) 0.01 сек.
04 FAILED (Bad Data) 0.01 сек.
05 FAILED (Bad Data) 0.01 сек.
06 FAILED (Bad Data) 0.01 сек.
07 FAILED (Bad Data) 0.01 сек.
08 FAILED (Bad Data) 0.01 сек.
09 FAILED (Bad Data) 0.01 сек.
10 FAILED (Bad Data) 0.01 сек.
11 FAILED (Bad Data) 0.01 сек.
12 FAILED (Bad Data) 0.01 сек.
13 FAILED (Bad Data) 0.01 сек.
14 FAILED (Bad Data) 0.01 сек.
15 FAILED (Bad Data) 0.01 сек.
Прошло тестов: 0 из 16.
Набрано баллов: 0 из 60.
Ваша претензия НЕОБОСНОВАНА.
Цікаво, де в програмі Bad Data, якщо в мене(на паскалі) не видає ніякої помилки і програма працює бездоганно.
Цей же код, 15 з 16 тестів:
type arr = array[1..1500] of byte; var b : array[1..5] of integer; m, n, t, i, j, p, k, s : integer; tsss, sss1, sss : arr; ctsss, csss1, csss : integer; a, c : arr; na, nb, nc : integer; ck : array[0..5] of arr; cck : array[0..5] of integer; ct : array[0..25] of arr; cct : array[0..25] of integer; function max(a, b : integer): integer; begin if a>b then max:=a else max:=b; end; function min(a, b : integer): integer; begin if a>b then min:=b else min:=a; end; procedure trans(n : longint; var c : arr; var k : integer); begin k:=0; while n>0 do begin inc(k); c[k]:=n mod 10; n:=n div 10; end; end; procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var t,i : byte; begin t:=0; k:=max(m,n); for i:=1 to k do begin c[i]:=a[i]+b[i]+t; t:=c[i] div 10; c[i]:=c[i] mod 10; end; if t>0 then begin k:=k+1; c[k]:=t; end; end; procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); k:=0; for i:=1 to m do begin t:=0; cc[i-1]:=0; for j:=1 to n do begin cc[j+i-1]:=b[j]*a[i]+t; t:=cc[j+i-1] div 10; cc[j+i-1]:=cc[j+i-1] mod 10; end; if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1; summ(c,k,cc,p,c,k); end; end; procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer); var i, j, p : integer; t : byte; cc : arr; begin fillchar(c,sizeof(c),0); c[1]:=1; k:=1; for i:=1 to n do multiply(c,k,a,m,c,k); end; procedure ccc(a, b : integer; var c : arr; var k: integer); var p, q : array[0..25] of longint; ss1, ss2 : int64; i, j : integer; begin if a>(b div 2) then a:=b-a; for i:=b downto b-a+1 do begin p[b-i+1]:=i; q[b-i+1]:=b-i+1; end; for i:=a downto 1 do for j:=a downto 1 do if p[j] mod q[i]=0 then begin p[j]:=p[j] div q[i]; q[i]:=1; break; end; ss1:=1; ss2:=1; for i:=1 to a do begin ss1:=ss1*p[i]; ss2:=ss2*q[i]; end; ss1:=ss1 div ss2; trans(ss1,c,k); end; procedure write_result; begin for i:=csss downto 1 do write(sss[i]); writeln; halt; end; begin read(n,m,k); t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0); for i:=1 to t do b[i]:=0; for i:=0 to m do ccc(i,m,ck[i],cck[i]); for i:=0 to sqr(m)-t*m do ccc(i,sqr(m)-t*m,ct[i],cct[i]); while true do begin s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1; for i:=1 to t do begin s:=s+b[i]; step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); end; if k-s<=sqr(m)-t*m then begin step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss); multiply(sss1,csss1,tsss,ctsss,sss1,csss1); summ(sss,csss,sss1,csss1,sss,csss); end; if k=s then begin p:=t; while (b[p]=0) and (p>0) do dec(p); if ((p=(k div m)) and ((k mod m)=0)) or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin write_result; end; b[p]:=0; dec(p); while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; inc(b[p]); end else begin p:=t; while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end; if p=0 then begin write_result; end; inc(b[p]); end; end; end.
Питання: в чому різниця?
Поза форумом
2V@ny@: Читай мої пости . В тому рішенні, що ти відправив ти обмежив стек в 16384. Цього недостатньо для твоєї программи. Вона вилітає за стек оверлоу.
PS:
Вивід твоєї проги на тест 5 100 12:
Runtime error 216 at 0x00401944
0x00401944
Runtime error 216 at 0x004035FE
0x004035FE
0x00403B15
0x00402E34
0x0040246C
0x00402AA9
0x00403648
0x00401944
Це не Бед Дата??
Відредаговано RuslanSM (2008-01-11 17:42:25)
Поза форумом
ПРИМУШУЄТЕ ГОВОРИТИ ГОЛОСНО.
В ВАРІАНТІ, ЯКИЙ ВИ ПЕРЕВІРЯЄТЕ, ВІДСУТНІ ДИРЕКТИВИ КОМПІЛЯТОРА.
А НАДІСЛАНОМУ ВАРІАНТІ ВОНИ ПРИСУТНІ.
(НЕВЖЕ ВИ НЕ ПОМІТИЛИ? ЧИ ДЛЯ ВАС ЦЕ НЕ ЦІКАВО?)
ДО ЧОГО ПРИВОДИТЬ НЕРОЗУМНЕ ВИКОРИСТАННЯ В FPC 2.0.4 ДИРЕКТИВИ М, ВАМ ВЖЕ НАМАГАЛИСЯ ПОЯСНИТИ НА ФОРУМІ.
НЕ ПОТРІБНО ШУКАТИ ВИННИХ. ПОМИЛКА ПРИКРА, АЛЕ ВАША.
МИ УВАЖНО СТАВИМСЯ ДО ЗВЕРНЕНЬ УЧАСНИКІВ, АЛЕ ПРОСИМО ЇХ БУТИ КОРРЕКНИМИ