На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
это не понятно...
А ЧО тут неясного? о_О
якшо 2 числа однакові, то чисел, що знаходяться між ними немає, тому їх сума 0.
Відредаговано astor (2008-12-23 20:38:53)
Поза форумом
Ну почнемо!
Почнемо із Winner. Все знання щоб розвязати задачу - сума арифметичної прогресії і знаходження похідної та екстр. точок.
var F1, F2, Z, N1, N2, T : int64; begin read(Z,T); N1:=trunc((2*Z-T)/(2*T)); N2:=N1+1; F1:=round(Z*N1-(N1*(N1+1)/2-1)*T); F2:=round(Z*N2-(N2*(N2+1)/2-1)*T); if F2>F1 then writeln(N2,' ',F2) else writeln(N1,' ',F1); end.
Далі - Cavalery. Задача на знання пошука у ширину. Починаємо з клітинки в яку потрібно попасти і робимо ходи конем. Маскимальне чисто із тих клітинок, в які ми хочемо потрапити і буде розвязком .
type arr2 = array[1..100,1..100] of integer; const d1 : array[1..8] of integer=(2,1,-1,-2,-2,-1,1,2); d2 : array[1..8] of integer=(-1,-2,-2,-1,1,2,2,1); var m, n, s1, nn, i, x0, y0, s, t : integer; s2 : int64; d : arr2; count : array[1..10000] of integer; procedure poshuk(x0,y0 : integer; var d : arr2); var ax, ay : array[1..10000] of integer; i, j, k, l : integer; function xod(p, q : integer) : boolean; begin if (p>0) and (p<=n) then if (q>0) and (q<=m) then if d[p,q]=-1 then begin xod:=true; exit; end; xod:=false; end; begin for i:=1 to n do for j:=1 to m do d[i,j]:=-1; ax[1]:=x0; ay[1]:=y0; d[x0,y0]:=0; k:=0; l:=1; repeat inc(k); for i:=1 to 8 do if xod(ax[k]+d1[i],ay[k]+d2[i]) then begin inc(l); ax[l]:=ax[k]+d1[i]; ay[l]:=ay[k]+d2[i]; d[ax[l],ay[l]]:=d[ax[k],ay[k]]+1; end; until (k=l); end; begin read(n,m); read(s,t); poshuk(s,t,d); read(nn); s1:=0; s2:=0; for i:=1 to nn do begin read(x0,y0); if d[x0,y0]=-1 then inc(s1) else s2:=s2+d[x0,y0]; end; if s1>0 then writeln(s1) else writeln(s2); end.
Device.
Задачу можно написати за хвилину динамічним програмуванням.
program device; var a:array[1..100000000] of int64; i,n:int64; begin read(n); i:=6; a[1]:=0; a[2]:=0; a[3]:=1; a[4]:=0; a[5]:=1; while i<=n do begin if i mod 2 =0 then a[i]:=2*a[i div 2] else a[i]:= a[i div 2]+a[(i div 2) +1]; inc(i); end; writeln(a[n]); end.
Але тут О(2*N). На макс значеннях хвилину працюе, і тому будемо знаходити тільки ті значення, що нам потрібні.
var N : int64; a, b : array[1..1000] of int64; t : integer; function F(N : int64) : int64; var k, p1, p2 : int64; i : integer; begin k:=N div 2; if N<3 then begin F:=0; exit end else if N=3 then begin F:=1; exit; end; for i:=1 to t do if a[i]=N then begin F:=b[i]; exit; end; if odd(N) then begin p1:=F(N-k); inc(t); a[t]:=N-k; b[t]:=p1; p2:=F(k); inc(t); a[t]:=k; b[t]:=p2; F:=p1+p2; end else begin p2:=F(k); inc(t); a[t]:=k; b[t]:=p2; F:=2*p2; end; end; begin t:=0; read(N); writeln(F(N)); end.
На цьому алгоритмі для 10^18 за декілька мілісекунд.
Summa. задачу можно написати "втупу") Але від цього толку - 5 балів.
Довго парився, дійшов до задічі скільки раз зустрічаєтьзя цифра х у проміжку (а,b). Проходим усі цифри і маємо відповідь.
var N1, N2 : longint; function F(N : longint) : int64; var st1, st2, st3, st : string; i, k, x, code : integer; S : int64; p, p1 : longint; begin str(N,St); St3:=St[length(St)]; St2:=copy(St,1,length(St)-1); val(St2,p,code); S:=0; for x:=1 to 9 do begin str(x,St1); if St1<=St3 then S:=S+(p+1)*x else S:=S+p*x; end; for i:=2 to length(St)-1 do begin St2:=copy(St,1,i-1); val(St2,p,code); k:=length(St)-i; St3:=copy(St,i+1,k); val(St3,p1,code); k:=round(exp(ln(10)*k)); for x:=1 to 9 do begin str(x,St1); if St1>St[i] then S:=S+p*k*x else if St1=St[i] then S:=S+(p*k+p1+1)*x else S:=S+(p+1)*k*x; end; end; St3:=St[1]; St2:=copy(St,2,length(St)-1); val(St2,p,code); k:=length(St)-1; k:=round(exp(ln(10)*k)); for x:=1 to 9 do begin str(x,St1); if St1=St3 then S:=S+(p+1)*x else if St1<St3 then S:=S+k*x; end; F:=S; end; begin read(N1,N2); writeln(F(N2)-F(N1-1)); end.
Market. Цікава задача, зводиться до такої: яке найменше число не можна представити у вигляді суми чисел масиву, а ця вже досить відома.
type list = array[1..20000] of longint; var A, B, D : list; C, S : int64; N, M, j, i : integer; procedure Qsort(var a: list; Lo,Hi: integer); procedure sort(l,r: integer); var i,j: integer; x,y: longint; begin i:=l; j:=r; x:=a[(l+r) DIV 2]; repeat while a[i]<x do i:=i+1; while x<a[j] do j:=j-1; if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin sort(Lo,Hi); end; begin read(N); for i:=1 to N do read(A[i]); read(M); for i:=1 to M do read(B[i]); for i:=1 to N do C:=C+A[i]; for i:=1 to N do D[i]:=A[i]; for i:=N+1 to N+M do D[i]:=B[i-N]; QSort(D,1,M+N); S:=1; for i:=1 to M+N do if S>=D[i] then S:=S+D[i] else break; writeln(C-S); end.
Скільки набрало потім скажу)
Поза форумом
Device:
#include <map> #include <iostream> #include <cstdio> using namespace std; #define mp make_pair int a,b,c,d,i,j,n,m,k; map <int,int> p; int rec(int a) { if (a<3) return 0; else if (a==3) return 1; else if (p.count(a)!=0) return p[a]; if (a&1) { int b=rec(a>>1),c=rec((a>>1)+1); p.insert(mp(a,b+c)); return b+c; } else { int b=rec(a>>1); b<<=1; p.insert(mp(a,b)); return b; } } int main() { p.clear(); scanf("%d",&n); a=rec(n); printf("%d\n",a); }
Winner:
#include <iostream> #include <cstdio> using namespace std; #define ll long long int a,b,i,j,n,m,k,z,t; ll c,d; inline ll f(ll a) { ll rr=-(ll)t*a*a+(ll)a*(2LL*(ll)z-(ll)t)+2LL*(ll)t; rr>>=1; return rr; } int main() { scanf("%d%d",&z,&t); a=(2*z+1)/(2*t); if (a<2) a=2; b=a+1; c=f((ll)a); d=f((ll)b); if (c>=d) { d=c; b=a; } while (b>2 && f(b-1)==d) --b; cout<<b<<" "<<d<<endl; }
Cavalery:
#include <iostream> #include <cstdio> using namespace std; #define mp make_pair #define x first #define y second #define INF 1000000000 const int dx[]={1, 1,-1,-1,2, 2,-2,-2}; const int dy[]={2,-2, 2,-2,1,-1, 1,-1}; int ci,cj,bi,bj,a,b,c,d,i,j,n,m,k; int mas[102][102]; pair <int,int> st[10003]; inline bool norm(int ci,int cj) { return (ci>=1 && cj>=1 && ci<=n && cj<=m); } int main() { memset(mas,63,sizeof(mas)); scanf("%d%d",&n,&m); scanf("%d%d",&bi,&bj); a=0; b=0; st[0]=mp(bi,bj); mas[bi][bj]=0; while (a<=b) { ci=st[a].x,cj=st[a++].y; for (int i=0;i<8;i++) { int fi=ci+dx[i],fj=cj+dy[i]; if (norm(fi,fj) && mas[fi][fj]>=INF) { st[++b]=mp(fi,fj); mas[fi][fj]=mas[ci][cj]+1; } } } scanf("%d",&k); c=0; d=0; for (int i=0;i<k;i++) { scanf("%d%d",&a,&b); c=min(c+mas[a][b],INF); if (mas[a][b]>=INF) d++; } if (d) printf("%d\n",d); else printf("%d\n",c); }
Поза форумом
Может и не в тему, но думаю будет полезно:
http://www2.olymp.vinnica.ua/cgi-bin/v_ … nguage=ukr
Линк на общие резы за первые 2 тура.
Поза форумом
офтоп: скільке треба балів, щоб пройти в 4 тур?
Поза форумом
astor написав:
это не понятно...
А ЧО тут неясного? о_О
якшо 2 числа однакові, то чисел, що знаходяться між ними немає, тому їх сума 0.
я бы написал if m=n then write(сума_цифр(m))
Поза форумом
V@ny@ написав:
Маскимальне чисто із тих клітинок, в які ми хочемо потрапити і буде розвязком .
не ври нам - сумма чисел из клеток, в которые надо попасть
Поза форумом
astor написав:
офтоп: скільке треба балів, щоб пройти в 4 тур?
определяется жури по окончанию 3 тура
Поза форумом
redman17 написав:
V@ny@ написав:
Маскимальне чисто із тих клітинок, в які ми хочемо потрапити і буде розвязком .
не ври нам - сумма чисел из клеток, в которые надо попасть
це глупость, починаємо всіма ходити одночасно, коли останній прийде(якщо прийде) тоді й буде кінець, за неї в мене 40)
Всьго 165, за суму половина - важка задача. маркет і вінер мабуть макс не пройшло, зараз протестую
Поза форумом
Давайте не превращать тему "Разбор задач второго тура" в тему "Мои коды".
Пускай каждый кто оставляет свое решение следит, что бы оно не повторяло уже размещенное тут, или существенно улучшало размещенную уже идею.
+ Очень важно чтобы это был не просто код, а и поянение своего решения хотя бы в общих словах.
Насколько я понимаю предназначение такой темы - помощь тем, кто не смог решить что-то + обсуждение наилучшего возможного решения (преимуществ разных решений)
Відредаговано redman17 (2008-12-24 16:20:06)
Поза форумом
я бы написал if m=n then write(сума_цифр(m))
ну ненаю... в мене пройшло 39/40, можливо, на цьому і залагало...
Поза форумом
V@ny@ написав:
Далі - Cavalery. Задача на знання пошука у ширину. Починаємо з клітинки в яку потрібно попасти і робимо ходи конем. Маскимальне чисто із тих клітинок, в які ми хочемо потрапити і буде розвязком .
type
arr2 = array[1..100,1..100] of integer;
const
d1 : array[1..8] of integer=(2,1,-1,-2,-2,-1,1,2);
d2 : array[1..8] of integer=(-1,-2,-2,-1,1,2,2,1);
var
m, n, s1, nn, i, x0, y0, s, t : integer;
s2 : int64;
d : arr2;
count : array[1..10000] of integer;
procedure poshuk(x0,y0 : integer; var d : arr2);
var ax, ay : array[1..10000] of integer;
i, j, k, l : integer;
function xod(p, q : integer) : boolean;
begin
if (p>0) and (p<=n) then
if (q>0) and (q<=m) then
if d[p,q]=-1 then begin xod:=true; exit; end;
xod:=false;
end;
begin
for i:=1 to n do
for j:=1 to m do d[i,j]:=-1;
ax[1]:=x0; ay[1]:=y0; d[x0,y0]:=0; k:=0; l:=1;
repeat
inc(k);
for i:=1 to 8 do
if xod(ax[k]+d1[i],ay[k]+d2[i]) then begin
inc(l); ax[l]:=ax[k]+d1[i]; ay[l]:=ay[k]+d2[i];
d[ax[l],ay[l]]:=d[ax[k],ay[k]]+1;
end;
until (k=l);
end;
begin
read(n,m);
read(s,t);
poshuk(s,t,d);
read(nn);
s1:=0; s2:=0;
for i:=1 to nn do
begin
read(x0,y0);
if d[x0,y0]=-1 then inc(s1)
else s2:=s2+d[x0,y0];
end;
if s1>0 then writeln(s1)
else writeln(s2);
end.
возможно я что-то не понимаю, возтожно - ты...
s2:=s2+d[x0,y0];
Відредаговано redman17 (2008-12-24 20:50:14)
Поза форумом
А когда будут задания 3 тура?
Поза форумом
Ну я сомневаюсь что задания будут до нового года)
Поза форумом