Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2009-11-28 21:36:11

guest1
Новий користувач
Зареєстрований: 2006-12-19
Повідомлень: 309
Вебсайт

Обсуждение решений

Что-то уже день прошёл, а темы всё нет smile
Впрочем, что тут обсуждать... Задачи-то лёгкие.

UPD: 100/100.

NewIllusion:

Код:

program NewIllusion;
var N, K: longint;
function Transmute(value: longint): longint;
begin
    if value > 31 then Transmute:=sqr(value) div 100
                  else Transmute:=sqr(value) div 10;
end;
begin
    read(N, K);
    while K > 0 do begin
        N:=Transmute(N);
        dec(K);
        if (N = 10) or
           (N = 12) or
           (N = 14) or
           (N = 19) or
           (N = 36) then break;
    end;
    if (K = 0) or (N = 10) then begin
        write(N);
        halt;
    end;
    K:=K mod 4;
    while K > 0 do begin
        N:=Transmute(N);
        dec(K);
    end;
    write(N);
end.

Tangent:

Код:

{$N+}
program tangent;
type current = extended;
function DistX(px1, py1, px2, py2: current): current;
begin
    DistX:=sqrt(sqr(px1 - px2) + sqr(py1 - py2));
end;
var x1, y1, r1, x2, y2, r2, tm: longint;
    dsx: current;
begin
    read(x1, y1, r1, x2, y2, r2);
    dsx:=DistX(x1, y1, x2, y2);
    if dsx > r1 + r2 then begin write(4); halt; end;
    if dsx = r1 + r2 then begin write(3); halt; end;
    if (x1 = x2) and (y1 = y2) and (r1 = r2) then begin write(7); halt; end;
    if r1 < r2 then begin tm:=r1; r1:=r2; r2:=tm; end;
    if dsx + r2 < r1 then begin write(0); halt; end;
    if dsx + r2 = r1 then begin write(1); halt; end;
    write(2);
end.

Lazer:

Код:

{$N+}
program Lazer;
type current = extended;
var N, i, dx, dy, cx, cy, cr, rex: longint;
    koef: current;
function Direction(px, py: current): longint;
begin
    if px < 0 then begin
        if py < 0 then Direction:=1;
        if py = 0 then Direction:=2;
        if py > 0 then Direction:=3;
    end;
    if px = 0 then begin
        if py < 0 then Direction:=4;
        if py = 0 then Direction:=5;
        if py > 0 then Direction:=6;
    end;
    if px > 0 then begin
        if py < 0 then Direction:=7;
        if py = 0 then Direction:=8;
        if py > 0 then Direction:=9;
    end;
end;
function Destroys: boolean;
var funcRes: boolean;
    ctx, qa, qb, qx, qy: current;
begin
    funcRes:=false;
    if dx = 0 then begin
        if (abs(cx) < cr) and ((dy >= 0) = (cy >= 0)) then funcRes:=true;
    end else begin
        qa:=1 + sqr(koef);
        qb:=-2 * (cy * koef + cx);
        ctx:=sqr(qb) - 4 * qa * (sqr(cx) + sqr(cy) - sqr(cr));
        if ctx > 0 then begin
            funcRes:=true;
            if ((dy >= 0) <> (cy >= 0)) and
               ((dx >= 0) <> (cx >= 0)) then funcRes:=false;
            qx:=(sqrt(ctx) - qb) / (2 * qa);
            qy:=koef * qx;
            if Direction(dx, dy) <> Direction(qx, qy) then funcRes:=false;
        end;
    end;
    Destroys:=funcRes;
end;
begin
    read(N, dx, dy); rex:=0;
    if dx <> 0 then koef:=dy / dx;
    for i:=1 to N do begin
        read(cx, cy, cr);
        if Destroys then inc(rex);
    end;
    write(rex);
end.

Radars:

Код:

program Radars;
const nmax = 100000;
var i, N, mi, ma: longint;
    arr: array[1..nmax] of longint;
    maxval, curval, tempval: int64;
begin
    read(N); read(arr[1]);
    mi:=arr[1]; ma:=arr[1]; maxval:=0;
    for i:=2 to N do begin
        read(arr[i]);
        if mi > arr[i] then mi:=arr[i];
        if ma < arr[i] then ma:=arr[i];
    end;
    for i:=1 to N do begin
        curval:=ma - arr[i];
        tempval:=arr[i] - mi;
        curval:=curval * tempval;
        if maxval < curval then maxval:=curval;
    end;
    write(maxval);
end.

Lotto:

Код:

program Lotto;
var i, j, N, M: longint;
function GradeX(value, grade: longint): longint;
var funcRes, xI: longint;
begin
    funcRes:=1;
    for xI:=1 to grade do funcRes:=funcRes * value;
    GradeX:=funcRes;
end;
function PrimeX(value: longint): boolean;
var funcRes, ts: boolean;
    xI: longint;
begin
    funcRes:=true; ts:=true; xI:=5;
    if (value mod 2 = 0) or (value mod 3 = 0) then funcRes:=false else begin
        while xI <= trunc(sqrt(value)) do begin
            if value mod xI = 0 then begin
                funcRes:=false;
                break;
            end;
            if ts then inc(xI, 2)
                  else inc(xI, 4);
            ts:=not ts;
        end;
    end;
    if value < 13 then begin
        if (value = 2) or (value = 3) or (value = 5) or (value = 7) or
           (value = 11) then funcRes:=true else funcRes:=false;
    end;
    PrimeX:=funcRes;
end;
begin
    read(N);
    if PrimeX(N * 10 + 1) then begin write(N * 10 + 1); halt; end;
    if PrimeX(N * 10 + 3) then begin write(N * 10 + 3); halt; end;
    if PrimeX(N * 10 + 7) then begin write(N * 10 + 7); halt; end;
    if PrimeX(N * 10 + 9) then begin write(N * 10 + 9); halt; end;
    for i:=1 to maxlongint do
        for j:=0 to GradeX(10, i) - 1 do begin
            M:=N * GradeX(10, i) + j;
            if PrimeX(M * 10 + 1) then begin write(M * 10 + 1); halt; end;
            if PrimeX(M * 10 + 3) then begin write(M * 10 + 3); halt; end;
            if PrimeX(M * 10 + 7) then begin write(M * 10 + 7); halt; end;
            if PrimeX(M * 10 + 9) then begin write(M * 10 + 9); halt; end;
        end;
end.

Відредаговано guest1 (2009-11-29 19:02:26)

Поза форумом

 

#2 2009-11-28 21:55:41

Andrey
Олімпієць
Звідки: Киев, Украина
Зареєстрований: 2005-10-15
Повідомлень: 100

Re: Обсуждение решений

Вот мои, хоть и не успел отправить ни одной задачи

Newillusion

Код:

 #include <stdio.h>
int n;
long t, k;
int a[90]={10, 12, 14, 16, 19, 22, 25, 28, 32, 36, 40, 44, 48, 52, 57, 62, 67, 72, 78, 84, 90, 96, 10, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 42, 43, 44, 46, 47, 49, 50, 51, 53, 54, 56, 57, 59, 60, 62, 64, 65, 67, 68, 70, 72, 73, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98};
int main()
{
    scanf("%d%ld", &n, &k);
    for(t=0; t<k; t++, n = a[n-10]);
    printf("%d", n);
    return 0;
}

Tangent

Код:

#include <stdio.h>
#include <math.h>
long X1, Y1, R1, X2, Y2, R2;
float d;
int main()
{
    scanf("%ld%ld%ld%ld%ld%ld", &X1, &Y1, &R1, &X2, &Y2, &R2);
    if(X1==X2 && Y1==Y2 && R1==R2)
    printf("%d", 7); else
    {
        d=sqrt(pow(X2-X1,2)+pow(Y2-Y1,2));
        if(fabs(d-R1-R2)<0.0000001) printf("%d", 3); else
        if(d>R1+R2)printf("%d", 4);else
        if(fabs(d-abs(R1-R2))<0.0000001) printf("%d", 1);else
        if(d<abs(R1-R2)) printf("%d", 0);else
        printf("%d", 2);
    }
    return 0;
}

Lazer

Код:

#include <stdio.h>
#include <math.h>
int i, n, dx, dy, x, y, r;
int c=0;
float d;
int main()
{
    scanf("%d%d%d", &n, &dx, &dy);
    d=sqrt(pow(dx,2)+pow(dy,2));
    for(i=0; i<n; i++)
    {
        scanf("%d%d%d", &x, &y, &r);
        if(dx*x+dy*y>0 && abs(dy*x - dx*y)/d<r) c++;
    }
    printf("%d", c);
    return 0;
}

Radars

Код:

#include <stdio.h>
#include <math.h>
long i, n, min, max, avr, sum, a[100000];
double m1, m2;
int main()
{
    scanf("%ld%ld", &n, &a[0]);
    avr = min = max = a[0];
    for(i=1; i<n; i++)
    {
        scanf("%ld", &a[i]);
        if(a[i]<min) min = a[i]; else
        if(a[i]>max) max = a[i];
    }
    sum = min+max;
    for(i=1; i<n; i++)
    if(abs(sum-2*a[i])<abs(sum-2*avr)) avr = a[i];
    m1 = max - avr;
    m2 = (avr - min)*m1;
    printf("%.0f", m2);
    return 0;
}

Lotto

Код:

#include <stdio.h>
#include <math.h>
long i, n, k;
long simple(long N, long I)
{
    for(k=0; I>0; k=k*10+I%10, I/=10);
    while(k>0)
    {
        N=N*10+k%10;
        k/=10;
    }
    for(k=2; k<=sqrt(N) && N%k>0; k++);
    if(k>sqrt(N))
    return N; else
    return 0;
}
int main()
{
    scanf("%ld", &n);
    for(i=1; simple(n, i)==0; i++);
    printf("%ld", simple(n,i));
    return 0;
}

Відредаговано Andrey (2009-11-28 22:25:41)

Поза форумом

 

#3 2009-11-28 22:30:51

Loginf
Новий користувач
Зареєстрований: 2009-11-25
Повідомлень: 37

Re: Обсуждение решений

Хоть и не идеальные решения..но всёже)

Код:

program Newillusion;
var n,i:integer; K:longint;
begin
 readln(n,k);
 for i:=1 to k do begin
 n:=n*n;
 if n>1000 then n:=n div 100 else n:=n div 10;
 end;
 writeln(n);
end.

Код:

program Tangent;
var x1,y1,r1,x2,y2,r2:longint; l:real;k:integer;
begin
 read(x1,y1,r1,x2,y2,r2);
 l:=sqrt(sqr(x1-x2)+sqr(y1-y2));
 if l>r1+r2 then K:=4 else
  if l=r1+r2 then k:=1 else
   if (r1>l+r2)or(r2>l+r1) then k:=0 else
    if (r1=l+r2)or(r2=l+r1) then k:=1 else
     if l<r1+r2 then k:=2;
  writeln(k);
end.

Код:

program Lazer;
var a:array[1..1000,1..3] of integer;
    k,dx,dy,n,i:integer;  l:real;  x,y:boolean;
begin
 read(n,dx,dy); K:=0;x:=false;y:=false;
 if dx>=0 then x:=true; if dy>=0 then y:=true;
 for i:=1 to n do read(a[i,1],a[i,2],a[i,3]);
 for i:=1 to n do  begin
   l:=(sqr(2*a[i,1]+2*a[i,2]*dy/dx))-4*(sqr(dy/dx)+1)*(sqr(a[i,1])+sqr(a[i,2])-sqr(a[i,3]));
   if (l>0.01)and((((2*a[i,1]+2*a[i,2]+sqrt(l))/(2*sqr(dy/dx))>0)and(x))or((((2*a[i,1]+2*a[i,2]+sqrt(l))/(2*sqr(dy/dx))<0)
   and(not x)))) then
   k:=k+1; end;
writeln(k);
end.

Код:

program Radars;
var i,l,p1,p2,amax,amin,k,n:longint;c:boolean;
    a:array[1..16199] of longint;
begin
 read(n); amax:=-1000001; amin:=1000001;
 for i:=1 to n do begin read(a[i]);
  if a[i]>=amax then amax:=a[i];
   if a[i]<=amin then amin:=a[i];end;
 k:=(amin+amax) div 2;
   for i:=k downto amin+1 do begin
  c:=false;
 for l:=1 to n do
  if a[l]=i then begin p1:=(amax-i)*(i-amin);c:=true;break;end;
  if c=true then break;end;
 for i:=k+1 to amax-1 do begin
 c:=false;
 for l:=1 to n do
  if a[l]=i then begin p2:=(amax-i)*(i-amin);c:=true;break;end;
 if c=true then break;end;
 if p1>=p2 then writeln(p1) else writeln(p2);
end.

Код:

program Lotto;
var n,k,i,l:longint;e:boolean;r,t:string;s:integer;
begin
  readln(r);L:=1;val(r,n,s);
  for i:=n*10+1 to n*round(exp((9-length(r))*ln(10))) do begin
   str(i,t);
    if r=copy(t,1,length(r)) then
  if i mod 2=1 then begin
    e:=false;
    for k:=2 to (i div 2)+1 do
     if (i mod k=0) then begin e:=true;break;end;
    if not e then begin writeln(i);break;end;
   end;end;
end.

Поза форумом

 

#4 2009-11-28 22:36:21

Andrey
Олімпієць
Звідки: Киев, Украина
Зареєстрований: 2005-10-15
Повідомлень: 100

Re: Обсуждение решений

Loginf написав:

Хоть и не идеальные решения..но всёже)

В Тангете не рассмотрел вариант одинаковых координат и радиусов smile

Поза форумом

 

#5 2009-11-28 22:40:56

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

lotto

Код:

var a,chis,i,k,chislik,code:longint;
flag:boolean;
dobavka,nachatka,rezutka:string;
function perevirkanaprostotu(chislo:longint):boolean;
var i:longint;
begin
         perevirkanaprostotu:=true;
         for i:=2 to round(sqrt(chislo))do
             if chislo mod i=0 then begin
             perevirkanaprostotu:=false;
             break;
             end;
end;
begin
read(chis);
flag:=true;
k:=10;
while(flag)do begin
      k:=k+1;
      str(k,dobavka);
      delete(dobavka,1,1);
      str(chis,nachatka);
      rezutka:=nachatka+dobavka;
      val(rezutka,chislik,code);
      if (perevirkanaprostotu(chislik))then begin
                                         flag:=false;
                                         break;
      end;
end;
writeln(chislik);
end.

Поза форумом

 

#6 2009-11-28 22:42:34

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

А может быть не стоит выкладывать решения, если неизвестно, правильны ли они?


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#7 2009-11-28 22:43:45

Andrey
Олімпієць
Звідки: Киев, Украина
Зареєстрований: 2005-10-15
Повідомлень: 100

Re: Обсуждение решений

Как запустят онлайн проверку, я напишу сколько балов у меня каждая набрала)

Поза форумом

 

#8 2009-11-28 22:50:55

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

radars, без int64

Код:

var a:array[0..100000]of longint;
var b,chis1,chis2,c:array[0..100000]of longint;
var n,koor,i,k,vidstan,mnoznik1,mnoznik2,minimum,p,dovzina1,dovzina2,j:longint;
var potuz,delta,maximum:longint;
begin
for i:=0 to 100000 do a[i]:=0;
for i:=0 to 100000 do b[i]:=0;
minimum:=1000000000;maximum:=-1000000000;delta:=1000000000;
read(n);
for i:=1 to n do begin
read(koor);
a[i]:=koor;
if minimum>koor then minimum:=koor;
if maximum<koor then maximum:=koor;
end;
for i:=1 to n do begin
vidstan:=abs(abs(a[i]-minimum)-abs(a[i]-maximum));
if delta>vidstan then begin
   delta:=vidstan;
   mnoznik1:=abs(a[i]-minimum);
   mnoznik2:=abs(a[i]-maximum);
end;
end;
k:=0;
while(mnoznik1<>0)do begin
                     k:=k+1;
                     b[k]:=mnoznik1 mod 10;
                     mnoznik1:=mnoznik1 div 10;
end;
p:=1;
for i:=k downto 1 do begin
    p:=p+1;
    chis1[p]:=b[i];
    end;
chis1[1]:=0;
dovzina1:=p;
k:=0;
while(mnoznik2<>0)do begin
                     k:=k+1;
                     b[k]:=mnoznik2 mod 10;
                     mnoznik2:=mnoznik2 div 10;
end;
p:=0;
for i:=k downto 1 do begin
    p:=p+1;
    chis2[p]:=b[i];
    end;
dovzina2:=p;
for i:=1 to dovzina2 do begin
    for j:=1 to chis2[i] do
        for k:=dovzina2+dovzina1 downto 2 do begin
            c[k]:=c[k]+chis1[k];
             if c[k]>=10 then begin
                c[k]:=c[k]-10;
                c[k-1]:=c[k-1]+1;
             end;
        end;
    for k:=dovzina2+dovzina1 downto 2 do chis1[k]:=chis1[k-1];
end;
if c[1]=0 then k:=2 else k:=1;
for i:=k to dovzina2+dovzina1-1 do write(c[i]);
writeln;
end.

Поза форумом

 

#9 2009-11-28 22:52:11

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

Кстати, guest1, как ты догадался, что период повтора в NewIllusion всегда 4? Додумался, или пришёл к этому опытным путём?


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#10 2009-11-28 22:54:45

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

newilluzion

Код:

var chis,chis1,kilper,i,period,numer,chislo,zalish:longint;
begin
read(chis1);
read(kilper);
chislo:=chis1;
chis:=chis1;
period:=0;
for i:=1 to 100 do begin
         chis:=chis*chis;
         if chis>999 then
         chis:=chis div 100 else
         chis:=chis div 10;
         if chis=12 then begin period:=i;numer:=12;break;end;
         if chis=10 then begin period:=i;numer:=10;break;end;
end;
if period>kilper then begin
         for i:=1 to kilper do begin
         chislo:=chislo*chislo;
         if chislo>999 then
         chislo:=chislo div 100 else
         chislo:=chislo div 10;
         end;
         writeln(chislo);
         end
         else
   if numer=10 then writeln(10) else begin
   zalish:=kilper-period;
   zalish:=zalish mod 4;
                  if zalish=0 then write(12);
                  if zalish=1 then write(14);
                  if zalish=2 then write(19);
                  if zalish=3 then write(36);
   end;
end.

Поза форумом

 

#11 2009-11-28 22:56:25

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

Silicious Man написав:

Кстати, guest1, как ты догадался, что период повтора в NewIllusion всегда 4? Додумался, или пришёл к этому опытным путём?

LeonID, тебя вопрос тоже касается smile


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#12 2009-11-28 22:58:39

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

А хотя всё, теперь ясно … smile
я делал сложнее


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#13 2009-11-28 23:01:09

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

Silicious Man написав:

Silicious Man написав:

Кстати, guest1, как ты догадался, что период повтора в NewIllusion всегда 4? Додумался, или пришёл к этому опытным путём?

LeonID, тебя вопрос тоже касается smile

Я сразу допустил, что период какой-то есть. Потом при поисках этого периода обнаружил что он равен 4(при 12) и 1(при 10).

Поза форумом

 

#14 2009-11-28 23:04:31

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

Да, а я вот не догадался, что оно всегда к этим нескольким числам приходит smile и написал динамический поиск периода big_smile


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#15 2009-11-28 23:05:42

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

tangent

Код:

var x1,y1,x2,y2,r1,r2:longint;
    vidstmizcentr,x11,y11,x12,y12:extended;
begin
read(x1,y1,r1,x2,y2,r2);
x11:=x1;y11:=y1;x12:=x2;y12:=y2;
vidstmizcentr:=sqrt(sqr(x12-x11)+sqr(y12-y11));
if r2>=r1 then begin
if abs(vidstmizcentr-(r1+r2))<0.0000000001 then writeln(3) else
if vidstmizcentr>(r1+r2)then writeln(4) else
if (x1=x2)and(y1=y2)and(r1=r2)then writeln(7)else
if abs((vidstmizcentr+r1)-r2)<0.0000000001 then writeln(1) else
if (vidstmizcentr+r1)<r2 then writeln(0) else
writeln(2);
end else begin
if abs(vidstmizcentr-(r1+r2))<0.0000000001 then writeln(3) else
if vidstmizcentr>(r1+r2)then writeln(4) else
if abs((vidstmizcentr+r2)-r1)<0.0000000001 then writeln(1) else
if (vidstmizcentr+r2)<r1 then writeln(0) else
writeln(2);
end;
end.

Поза форумом

 

#16 2009-11-28 23:07:08

Silicious Man
Новий користувач
Звідки: Донецк
Зареєстрований: 2007-11-11
Повідомлень: 79

Re: Обсуждение решений

Получается, я единственный, кто рассматривал вариант нулевой окружности в задаче Tangent? smile


—————————————————————————————————
Life is a beautiful place where dreams and reality live in peace.

Поза форумом

 

#17 2009-11-28 23:15:03

Andrey
Олімпієць
Звідки: Киев, Украина
Зареєстрований: 2005-10-15
Повідомлень: 100

Re: Обсуждение решений

Silicious Man написав:

Получается, я единственный, кто рассматривал вариант нулевой окружности в задаче Tangent? smile

Я верю википедии)

Поза форумом

 

#18 2009-11-28 23:18:08

guest1
Новий користувач
Зареєстрований: 2006-12-19
Повідомлень: 309
Вебсайт

Re: Обсуждение решений

Не следует искать глубинный смысл в условиях туров, особенно первого smile

К первой сначала написал брутфорс.

Поза форумом

 

#19 2009-11-28 23:18:24

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

lazer(не самое оптимальное решение smile, но надеюсь правильное)

Код:

var
dx,dy,j,kilk,kilkprobitix,xk,yk,rk,koefficient:longint;
function perevirkaprobitosi(x,y,r:longint):boolean;
var
i,pochatok,kinec:longint;
xpromen,ypromen,nablizennja:extended;
begin
if abs(dx)>=abs(dy) then begin
if (dx>=0) and (dy>=0) then begin
if x-r<0 then pochatok:=0 else pochatok:=x-r;
if x+r<0 then kinec:=0 else kinec:=x+r;
  for i:=(pochatok-1) to (kinec+1) do begin
       xpromen:=i;
       if dx=0 then begin ypromen:=i;xpromen:=0;end else ypromen:=xpromen*(dy/dx);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else
if (dx>=0) and (dy<=0) then begin
if x-r<0 then pochatok:=0 else pochatok:=x-r;
if x+r<0 then kinec:=0 else kinec:=x+r;
   for i:=(pochatok-1) to (kinec+1) do begin
       xpromen:=i;
       if dx=0 then begin ypromen:=-i;xpromen:=0;end else ypromen:=xpromen*(dy/dx);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else
if (dx<=0) and (dy>=0) then begin
if x+r>0 then pochatok:=0 else pochatok:=x+r;
if x-r>0 then kinec:=0 else kinec:=x-r;
   for i:=(abs(pochatok)-1) to (abs(kinec)+1) do begin
       xpromen:=-i;
       if dx=0 then begin ypromen:=-i;xpromen:=0;end else ypromen:=xpromen*(dy/dx);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else begin
   if x+r>0 then pochatok:=0 else pochatok:=x+r;
   if x-r>0 then kinec:=0 else kinec:=x-r;
   for i:=(abs(pochatok)-1) to (abs(kinec)+1) do begin
       xpromen:=-i;
       if dx=0 then begin ypromen:=i;xpromen:=0;end else ypromen:=xpromen*(dy/dx);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end;
   end else begin
   {------------------------------------------------------------------------}

if (dx>=0) and (dy>=0) then begin
if y-r<0 then pochatok:=0 else pochatok:=y-r;
if y+r<0 then kinec:=0 else kinec:=y+r;
  for i:=(pochatok-1) to (kinec+1) do begin
       ypromen:=i;
       if dy=0 then begin xpromen:=i;ypromen:=0;end else xpromen:=ypromen*(dx/dy);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else
if (dx>=0) and (dy<=0) then begin
if y+r>0 then pochatok:=0 else pochatok:=y+r;
if y-r>0 then kinec:=0 else kinec:=y-r;
   for i:=abs(pochatok-1) to abs(kinec+10) do begin
       ypromen:=-i;
       if dy=0 then begin xpromen:=i;ypromen:=0;end else xpromen:=ypromen*(dx/dy);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else
if (dx<=0) and (dy>=0) then begin
if y-r<0 then pochatok:=0 else pochatok:=y-r;
if y+r<0 then kinec:=0 else kinec:=y+r;
  for i:=(pochatok-1) to (kinec+1) do begin
       ypromen:=i;
       if dy=0 then begin xpromen:=i;ypromen:=0;end else xpromen:=ypromen*(dx/dy);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end else begin
   if y+r>0 then pochatok:=0 else pochatok:=y+r;
   if y-r>0 then kinec:=0 else kinec:=y-r;
   for i:=abs(pochatok-1) to abs(kinec+1) do begin
       ypromen:=-i;
       if dy=0 then begin xpromen:=-i;ypromen:=0;end else xpromen:=ypromen*(dx/dy);
                        if (sqr(xpromen-x)+sqr(ypromen-y))<(r*r) then begin
                        perevirkaprobitosi:=true;break;end else
                        perevirkaprobitosi:=false;
   end;
   end;

   {------------------------------------------------------------------------}
   end;
end;
begin
read(kilk);
read(dx,dy);
for j:=1 to kilk do begin
    read(xk,yk,rk);
    koefficient:=10000 div rk;
    xk:=xk*koefficient;yk:=yk*koefficient;rk:=rk*koefficient;
    if perevirkaprobitosi(xk,yk,rk) then inc(kilkprobitix);
    end;
writeln(kilkprobitix);
end.

Поза форумом

 

#20 2009-11-28 23:26:04

guest1
Новий користувач
Зареєстрований: 2006-12-19
Повідомлень: 309
Вебсайт

Re: Обсуждение решений

О, по предварительным результатам по крайней мере третья и пятая у меня полностью верны tongue

Поза форумом

 

#21 2009-11-28 23:28:58

Слава
Олімпієць
Зареєстрований: 2005-10-15
Повідомлень: 68

Re: Обсуждение решений

NewIllusion:
http://i036.radikal.ru/0911/45/a1362ac500c7.png

Код:

#include <iostream>
using namespace std;
int main()
{
    int n,k,i;
    int a[100]={0,0,0,0,0,0,0,0,0,0,10,12,14,16,19,22,25,28,32,36,40,44,48,52,57,62,67,72,78,84,90,96,10,10,11,12,12,13,14,15,16,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,36,37,38,39,40,42,43,44,46,47,49,50,51,53,54,56,57,59,60,62,64,65,67,68,70,72,73,75,77,79,81,82,84,86,88,90,92,94,96,98};
    int d[100]={0,0,0,0,0,0,0,0,0,0,1,0,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    cin>>n>>k;
    while((d[n]==0)&&(k>0))
    {
        n=a[n];
        k--;
    }
    if(d[n]!=0)k%=d[n];
    for(i=0;i<k;i++) n=a[n];
    cout<<n<<endl;
    return 0;
}

Відредаговано Слава (2009-11-29 17:57:00)


skype slava_812

Поза форумом

 

#22 2009-11-28 23:32:03

LeonID
Новий користувач
Зареєстрований: 2008-12-09
Повідомлень: 160

Re: Обсуждение решений

Мое "усложненное" решение задачи lazer недобрало 5 балов (я это чувствовал).

Поза форумом

 

#23 2009-11-28 23:34:20

Loginf
Новий користувач
Зареєстрований: 2009-11-25
Повідомлень: 37

Re: Обсуждение решений

Хех, хоть с страницы сайта запустить проверку задач нельзя, но по ссылке http://www2.olymp.vinnica.ua/cgi-bin/v_ … nguage=ukr работает на 3ей и 5ой задаче на всех тестах)

Відредаговано Loginf (2009-11-28 23:35:16)

Поза форумом

 

#24 2009-11-28 23:35:16

Слава
Олімпієць
Зареєстрований: 2005-10-15
Повідомлень: 68

Re: Обсуждение решений

Lazer: (20 из 20)

Код:

#include<iostream>
#include<math.h>
using namespace std;
struct Point
{
    double x,y;
};
struct O:public Point
{
    double r;
};
Point per(Point A, Point B, Point C)
{
    Point D;
    Point F;
    F.x = C.x - (B.y - A.y);
    F.y = C.y + (B.x - A.x);
    double k2 = ((C.x-A.x)*(B.y-A.y) - (B.x-A.x)*(C.y-A.y))/
                ((B.x-A.x)*(F.y-C.y) - (F.x-C.x)*(B.y-A.y));
    D.x = (F.x-C.x)*k2 + C.x;
    D.y = (F.y-C.y)*k2 + C.y; 
    return(D);
}
double dist(double x1,double y1,double x2,double y2)
{
    double dx=x1-x2,dy=y1-y2;
    return sqrt(dx*dx+dy*dy);
}
int main()
{
    O a;
    double dx,dy;
    int n,i,k=0;
    cin>>n>>dx>>dy;
    Point A={0,0},B={dx,dy};
    for(i=0;i<n;i++)
    {
        cin>>a.x>>a.y>>a.r;
        Point C={a.x,a.y},D;
        D=per(A,B,C);
        if(dist(D.x,D.y,a.x,a.y)<a.r)
            if(D.x*dx>=0 && D.y*dy>=0)
                k++;
    }
    cout<<k<<endl;
    return 0;
}

skype slava_812

Поза форумом

 

#25 2009-11-28 23:37:37

Слава
Олімпієць
Зареєстрований: 2005-10-15
Повідомлень: 68

Re: Обсуждение решений

Lotto: (20 из 20)

Код:

#include<iostream>
#include<math.h>
using namespace std;

bool prost(int a)
{
  if((a==1)||(a==0)) return false;
  int b=(int)(sqrt((double) a));
  for(int i=2;i<=b;i++)
      if(a%i==0)
          return false;
  return true;
}

int main2(int n)
{
    int l=1,s,r,i,k;
    while(true)
    {
        k=n;s=1;
        for(i=0;i<l;i++)s*=10;
        k*=s;
        for(i=0;i<s;i++)
        {
            r=k+i;
            if(prost(r))
                return r;
        }
        l++;
    }
}
int main()
{
    int n;
    cin>>n;
    cout<<main2(n)<<endl;
    return 0;
}

skype slava_812

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt