Cerinţa
Într-un depozit foarte mare există un raft cu n+1
spații de depozitare, numerotate de la 1
la n+1
. Primele n
spatii de depozitare sunt ocupate cu n
pachete numerotate cu valori între 1
și n
, iar spațiul de depozitare n+1
este gol.
Administratorul depozitului decide mutarea pachetelor, astfel încât pentru orice i
, pachetul numerotat cu i
să se afle în spațiul de depozitare i
. Pentru aceasta se va folosi spațiul de depozitare suplimentar, n+1
, singura manevră validă fiind mutarea unui pachet dintr-un spațiu de depozitare în altul, cu condiția ca acesta să fie gol.
Determinați o succesiune de manevre prin care fiecare pachet să fie în spațiul corect.
Date de intrare
Fişierul de intrare pachete_multe.in
conţine pe prima linie numărul n
, iar pe a doua linie n
numere naturale separate prin spaţii. Al i
-lea număr reprezintă numărul pachetului aflat în spațiul de depozitare i
.
Date de ieşire
Fişierul de ieşire pachete_multe.out
va conţine pe prima linie numărul M
, reprezentând numărul de manevre efectuate. Pe fiecare dintre următoarele M
linii se descrie o manevră, prin două numere i j
, cu semnificația: se ia pachetul din spațiul i
și se mută în spațiul j
.
Restricţii şi precizări
1 ≤ n ≤ 100000
<— ATENȚIE AICI- pentru fiecare manevră
i j
efectuată,1 ≤ i,j ≤ n+1
,i ≠ j
, iar spațiulj
trebuie să fie gol - numărul de manevre realizate nu trebuie să fie minim
Exemplu
pachete_multe.in
5 2 5 4 3 1
pachete_multe.out
7 1 6 5 1 2 5 6 2 3 6 4 3 6 4
Explicație
Pachetele se vor muta în felul urmator.
2 | 5 | 4 | 3 | 1 | _ |
_ | 5 | 4 | 3 | 1 | 2 |
1 | 5 | 4 | 3 | _ | 2 |
1 | _ | 4 | 3 | 5 | 2 |
1 | 2 | 4 | 3 | 5 | _ |
1 | 2 | _ | 3 | 5 | 4 |
1 | 2 | 3 | _ | 5 | 4 |
1 | 2 | 3 | 4 | 5 | _ |
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Pachete_Multe:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>
using namespace std;
#define NN 100005
ifstream fin("pachete_multe.in");
ofstream fout("pachete_multe.out");
int n, spatiu[NN], unde[NN], liber ,M;
struct manevra{
int sursa,dest;
manevra(){sursa = 0, dest = 0;}
manevra(int i,int j){sursa = i, dest = j;}
friend ostream& operator << (ostream &os, manevra x)
{
os << x.sursa << " " << x.dest;
return os;
}
};
manevra v[2*NN+10];
void muta(int i){
v[++M] = manevra(i,liber);
spatiu[liber] = spatiu[i];
unde[spatiu[i]] = liber;
spatiu[i] = 0;
liber = i;
}
int main(){
assert(fin >> n );
for(int i=1 ; i<=n ; ++i)
assert(fin >> spatiu[i]), unde[spatiu[i]] = i;
liber = n+1;
for(int i=1 ; i<=n ; ++i)
if(spatiu[i]!=i)
{
//vad unde este pachetul i
if(spatiu[i]!=0) //spatiul i este ocupat, il eliberez
muta(i);
muta(unde[i]);
}
fout << M << "
";
for(int i=1;i<=M;++i)
fout << v[i] << "
";
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #401 Pachete_Multe
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #401 Pachete_Multe de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!