Rezolvare completă PbInfo #2844 Circular List Insert

Cerința

Se consideră o listă circulară simplu înlănțuită, alocată dinamic, cu n elemente, numere naturale citite de la tastatură; primul element al acestei liste este considerat element curent. Se citesc m numere naturale și pentru fiecare se aplică următoarea operație:

  • pentru numărul citit x elementul curent al listei avansează cu x poziții;
  • după elementul curent actual se inserează dublul său și elementul inserat devine element curent.

Să se afișeze elementele listei după cele m operații. Afișarea începe cu elementul care a fost element curent imediat după citire.

Date de intrare

Programul citește din fișierul circularlistinsert.in numărul n, iar apoi cele n elemente ale listei, separate prin spații, iar apoi m și m numere naturale, separate prin spații.

Date de ieșire

Programul va afișa în fișierul circularlistinsert.out elementele listei prelucrate cu spații între ele.

Restricții și precizări

  • 1 ≤ n ≤ 100.000
  • 1 ≤ m ≤ 10.000
  • cele n numere citite vor fi mai mici decât 1.000
  • cele m numere citite vor fi mai mici decât 2.000
  • pentru toate testele, după cele m inserări se vor obține în listă numere reprezentabile pe 32 de biți cu semn.

Exemplu

circularlistinsert.in

8
15 8 5 15 8 6 2 16
4
4 6 8 5

circularlistinsert.out

15 8 16 5 10 15 8 16 32 6 2 16  

Explicație

  • inițial, elementul curent este 15, iar x=4. Elementul curent avansează cu 4 poziții și devine 8, după el se inserează 16 și acesta devine element curent. Lista devine: 15 8 5 15 8 16 6 2 16.
  • elementul curent este 16 și x=6. Elementul curent avansează cu 6 poziții și devine 5, după el se inserează 10 și acesta devine element curent. Lista devine: 15 8 5 10 15 8 16 6 2 16.

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 Circular List Insert:

#include<bits/stdc++.h>
using namespace std;

ifstream in("circularlistinsert.in");
ofstream out("circularlistinsert.out");

list<int> v;
list<int>::iterator it,itt;

int main()
{
    int n,x,m;
    in>>n;
    for(int i=1;i<=n;i++)
        in>>x,v.push_back(x);
    it=v.begin();
    in>>m;
    for(int i=1;i<=m;i++)
    {
        in>>x;
        if(x>n)
            x%=n;
        for(int j=1;j<=x;j++)
        {
            if(it==v.end())
                it=v.begin(),j--;
            else
                it++;
        }
        if(it==v.end())
            it=v.begin();
        itt=it,itt++;
        if(itt!=v.begin())
        v.insert(itt,*it*2);
        n++,it++;
    }
    for(it=v.begin();it!=v.end();it++)
        out<<*it<<" ";
}

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 Adresa de email.

Rezolvarea problemei #2844 Circular List Insert

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2844 Circular List Insert 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!