| |
| Subiectul anterior :: Subiectul urmator |
|
| Autor |
Mesaj |
|
GiovanY Founder


Data inscrierii: 05/Sep/2008 Mesaje: 1979
|
Trimis: 13/12/2008 21:49 Titlul subiectului: [Tutorial C++]Principiul Lui Dirichlet |
|
|
Principiul lui Dirichlet
v: 89 54 4 63 96 17 98 6 55 60
s(i)=v[1]+...+v[i]
s:89 143 147 210 306 323 421 427 482 542
exista i a.i. s(i)%n=0 => v[1]+v[2]+...+v[i]
oricare i S(i)%n!=0 x%n=(1,n-1)
=>S(i)%n={1. 2, ..., n-1} i={1, 2, ...,n}
=>exista j,k=(1,n)
pp.j<k a.i. s(j)=s(k)
S(j)%n-r => s(j)n*c+r
=> s(k)-s(j)=n*c1+r-n*c2-r=n(c1-c2)
r: 8 3 7 0 6 3 1 7 2 2
j=3
=>(s(8)-s(3))% n=0
k=8
Exemplu de problema care foloseste principiul lu Dirichelt este urmoatoarea:
Se considera un vector format din n elemente nr intregi pozitive.
Sa se afiseze:
o secventa formata din elemente consecutive pt care suma elementelor
secventei se divide cu n.
| Cod: |
#include<fstream.h>
#include<conio.h>
int v[100], n, r[100];
void citire()
{
ifstream f("diri.in");
f>>n;
for(int i=1;i<=n;i++)
f>>v[i];
r[i]=(r[i-1]+v[i])%n;
}
void afis(int p, int u)
{
for(int i=p;i<=u;i++)
cout<<v[i]<<" ";
cout<<endl;
}
void calcul()
{ int pi, pf;
pi=pf=0;
for(int i=1;i<=n;i++)
if(r[i]==0)
{afis(1,i);
if(pf-pi<i-1)
{pi=1;
pf=i;
}
}
for(int j=1;j<n;j++)
for(int k=j+1;k<=n;k++)
if(r[j]==r[k])
{afis(j+1,k);
if(pf-pi<k-j-1)
{pf=k;
pi=j+1;
}
}
cout<<"Secventa de lungime maxima este:";
afis(pi,pf);
}
void main()
{clrscr();
citire();
calcul();
getch();
} |
Ps: Aceasta problema foloseste citire din fisier.
"diri.in"este un fisier creat in c++ unde scrii pe întâia linie n=numar de valori ,iar pe a doua linie valori in numar de n
de exemplu:
Tutorial 100% made by me. |
|
| Sus |
|
 |
|
|
Nu puteti crea un subiect nou in acest forum Nu puteti raspunde in subiectele acestui forum Nu puteti modifica mesajele proprii din acest forum Nu puteti sterge mesajele proprii din acest forum Nu puteti vota in chestionarele din acest forum
|
|
|
| |
|
Forum by kene | Powered by phpBB © 2001, 2002 phpBB Group
Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
|
|
|