Sigur v-aţi confruntat cu faptul că prea multe persoane folosesc Internetul simultan şi conexiunea devine foarte înceată. Pentru ameliorarea acestei probleme, Universitatea din Iaşi a descoperit a schemă eficientă, prin care să se taie accesul la Internet în mod sistematic şi într-o manieră corectă. Oraşele României au fost etichetate aleatoriu cu numere de la 1 la n. Sibiu a fost ales numărul 1, Iaşi numărul 2, Cluj numărul 3 şi aşa mai departe. Dacă alegem un număr m aleatoriu, accesul la Internet se va tăia mai întâi în oraşul 1, apoi în fiecare al m-lea oraş după acesta, parcurgând circular oraşele (1, 2, 3, . ..) şi ignorându-le pe cele deja tăiate.
De exemplu, pentru n=17 şi m=5, accesul la reţea va fi tăiat în ordinea: (1, 6, 11, 16, 5, 12, 2, 9, 17, 10, 4, 15, 14, 3, 8, 13, 7). Problema este că ar fi corect ca Iaşiul să fie tăiat ultimul (în fond, aici se află cei mai buni programatori din ţară!), aşa că, fiind dat numărul n, numărul m trebuie determinat astfel încât oraşul al doilea (Iaşi) să fie ultimul selectat.
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
int n,m,t[150],i,k,vizitat[150],indice=0,contor;
ifstream f("int.in");
ofstream g("int.out");
f>>n>>m;cout<<n<<" "<<m<<endl;
//De exemplu, pentru n=17 şi m=5, accesul la reţea va
// fi tăiat în ordinea:
//(1, 6, 11, 16, 5, 12, 2, 9, 17, 10, 4, 15, 14, 3, 8, 13, 7)
i=1;
t[i]=1;
vizitat[1]=1;//primul oras pentru care se taie conexiunea
for(i=2;i<=n;i++)
vizitat[t[i]]=0;
i=2;
while(i<=n)
{ indice=0; k=1;contor=0;
while(indice<=m)
{ if((t[i-1]+k)%n==0)
if(vizitat[(t[i-1]+k)%(n+1)]==0)
indice++;
else
contor++;
else
if(vizitat[(t[i-1]+k)%n]==0)
indice++;
else
contor++;
k++;
}
if((t[i-1]+m+contor)%n==0)
t[i]=(t[i-1]+m+contor)%(n+1);
else
t[i]=(t[i-1]+m+contor)%n;
vizitat[t[i]]=1;
i++;
}
for(i=1;i<=n;i++)
cout<<t[i]<<" ";
f.close();
g.close();
return 0;
}
nu reusesc sa inteleg unde am gresit!
am incercat dar cred ca am gresit in elaborarea algoritmului