Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Porbleme OLI Bucuresti 2008  (Citit de 2519 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
IronWing
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« : Februarie 23, 2008, 19:03:01 »

Salutare! Am participat la Olimpiada locala de informatica din Bucuresti si am obtinut 20 puncte: 10 la prima, 10 la a doua. Totusi am reusit sa ma calific. Sunt in clasa a XI-a. E prima oara cand trec de faza locala si imi e teama de OJI, pt ca problemele de la locala mi s-au parut grele.
Prin amabilitatea domnului profesor de informatica, am reusit sa obtin solutiile propuse de autori pentru probleme. Din pacate, mi se par grele, pt ca nu sunt comentate si nu le inteleg. De exemplu sunt niste locuri in care se folosesc operatii pe biti pe care nu le pricep.
Postez mai jos codul primei probleme Ion si Maria:
Cod:
/* Solutie O(m*2^m)
generam toate submultiimile de muchii si apoi determinam daca au fix k componente conexe
cu ajutorul un cautari in adancime in O(m)
o parcurgere in O(n^2) nu ar fi trebuit sa obtina 100p)
*/

#include<stdio.h>
#include<string.h>
#define maxn 16

long n,m,k,sel[maxn];
long v[maxn][maxn],t[maxn][maxn];

void df(long a,long val)
{
sel[a] = 1;
for( long i = 1; i <= v[a][0]; ++i)
{
if(sel[v[a][i]] == 0 && (t[a][i] & val) )
df(v[a][i],val);

}
}


long ver(long val)
{
long nr = 0;
memset(sel,0,sizeof(sel));

for( long i = 1; i <= n ;++i)
{
if(sel[i] == 0)
{
nr++;
df(i,val);
}
}
return ( nr == k);

}

int main()
{
long sol = 0;

freopen("ion.in","r",stdin);
freopen("ion.out","w",stdout);

scanf("%ld %ld %ld",&n,&m,&k);

for( long i = 1; i <= m; ++i)
{
long a,b;
scanf("%ld %ld",&a,&b);
v[a][++v[a][0]] = b;
t[a][++t[a][0]] = 1<<(i-1);
v[b][++v[b][0]] = a;
t[b][++t[b][0]] = 1<<(i-1);
}
long max = (1 << m),val = 0;
while( val != max)
{
sol+= ver(val);
val++;
}

printf("%ld\n",sol);

return 0;
}



Si codul problemei a doua, Cuvinte:

Cod:
#include<stdio.h>
#include<string.h>

#define maxn 1001
#define rest 9967

long v[maxn], sol[maxn],n,d;

void mult( long *a,long *b)
{
long c[maxn];
memset(c,0,sizeof(c));

for( long i = 0; i < d; ++i)
for( long j = 0; j < d; ++j)
{
long x = i + j;
if(x>=d) x-=d;
c[x] = (c[x] + a[i] * b[j])% rest;
}
for( long i = 0; i < d; ++i)
{
a[i] = c[i];
}

}


int main()
{
freopen("cuvinte.in","r",stdin);
freopen("cuvinte.out","w",stdout);

scanf("%ld %ld",&n,&d);
sol[0] = 1;
for( long i = 0; i <= 25; ++i)
v[(i%d)] += 1;
long nr = 1;

while(n)
{
if( n & nr)
{
mult(sol,v);
n-=nr;
}
nr*=2;
mult(v,v);
}

printf("%ld\n",sol[0]);



return 0;
}


Poate ma ajutati sa le inteleg si eu va rog. Nu stiu ce face de exemplu o expresie de genul if(a & b)
Dat fiind faptul ca au fost rezultate si de 200 p, ma face sa cred ca sunt foarte slab, si ma simt prost deorece nu am cu cine sa discut. Textele problemelor nu le-am gasit pe internet, din pacate.
Va multumesc pentru ajutor!
« Ultima modificare: Februarie 23, 2008, 19:12:46 de către Vlad Paunescu » Memorat
Florian
Nu mai tace
*****

Karma: 125
Deconectat Deconectat

Mesaje: 832



Vezi Profilul
« Răspunde #1 : Februarie 23, 2008, 19:34:27 »

De unde as putea sa iau si eu problemele? Ma intereseaza cele de la a10a in mod special... Dar si celelalte....
Memorat
IronWing
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #2 : Februarie 23, 2008, 19:46:59 »

Eu l-am rugat pe profesorul de informatica sa-mi dea solutiile si el a vorbit cu autorii problemelor. Cat despre probleme, subiectele nu le-am  gasit pe internet din pacate SadBrick wall
Memorat
peanutz
Nu mai tace
*****

Karma: 10
Deconectat Deconectat

Mesaje: 296



Vezi Profilul
« Răspunde #3 : Februarie 23, 2008, 19:55:17 »

a & b -> Transformi in baza 2 a si b, iei bitii comuni si vei avea

01011 &
10111 = 00011
Memorat

....staind....
Tabara
Nu mai tace
*****

Karma: 20
Deconectat Deconectat

Mesaje: 216



Vezi Profilul
« Răspunde #4 : Februarie 24, 2008, 01:22:25 »

Ca sa intelegi operatiile de baza pe biti te poti uita aici.

 Thumb up
Memorat
IronWing
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #5 : Februarie 25, 2008, 15:03:13 »

Va multumesc pentru sfaturi. Am inteles la ce sunt folosite operatiile pe baza de biti la prima problema.
Sunt folosite pentru a genera toate submultimile unei multimi:
Iata un algoritm pe care l-am facut eu care genereaza submultimile:

Cod:
#include <iostream.h>
#include <conio.h>
int a[300], b[300], n, i, j, m;
void main() {
clrscr();
cout<<"n: "; cin>>n;
for(i=1;i<=n;i++)
{  a[i]=i;
   b[i]=1<<(i-1);
}
m=1<<n;
for(i=0;i<m;i++)
 { for(j=1;j<=n;j++)
    if(i & b[j]) cout<<a[j]<<" ";
   cout<<endl;
 }
cout<<m;
getch();
}

Editat de admin: Poti folosi tag-ul code atunci cand postezi fractiuni de programe Smile
« Ultima modificare: Februarie 25, 2008, 18:55:39 de către Andrei Grigorean » Memorat
pandaemon
Strain


Karma: 4
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #6 : Februarie 25, 2008, 18:56:55 »

Pentru cine vrea prima cerinta de la OLI 2008 Bucuresti (11-12):

http://www.filebox.ro/download.php?key=f5e1213219e42992333e4f6bd1171233
Memorat
lamez0r
Strain


Karma: -4
Deconectat Deconectat

Mesaje: 23



Vezi Profilul
« Răspunde #7 : Februarie 26, 2008, 22:42:49 »

Daca ar putea cineva sa puna aici problemele de la oli din bucuresti. m-ar interesa cele de clasa a 10 in special. merci si bafta.

L.E: mda...la oli bihor s-au dat exact aceleasi probleme ca la oli bucuresti. daca le-ar fii pus cineva aici.. Brick wall
« Ultima modificare: Februarie 29, 2008, 18:37:34 de către Bogdan Bondor » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines