Rezolvare completă PbInfo #2564 Macara

O macara industrială automatizată execută operații de mutare a unor containere aflate într-un depozit de materiale. Acest depozit poate fi reprezentat ca o matrice dreptunghiulară cu m linii şi n coloane, fiecare element al matricei reprezentând un container. Mai exact, elementul situat pe linia i(1≤i≤m) şi coloana j(1≤j≤n) din matrice reprezintă numărul de dale de granit aflate în containerul situat în depozit pe poziția corespunzătoare. Toate dalele aflate în acelaşi container au aceeaşi culoare. În containerele cu dale negre, numărul de dale conținute este prim, în timp ce în containerele cu dale albe, numărul de dale conținute nu este prim. Primul container cu dale negre situat pe fiecare linie a matricei (dacă un astfel de container există) are un senzor special. Dalele din containere trebuie să fie transportate de către macara spre un terminal. Macaraua poate executa cel mult K comenzi. La o comandă, macaraua va colecta toate dalele aflate în containerele situate într-o zonă dreptunghiulară din depozit. Mai exact, o comandă are forma i1 j1 i2 j2, unde (i1,j1) reprezintă coordonatele containerului aflat în colțul din stânga-sus (linia, respectiv coloana), iar (i2,j2) coordonatele containerului aflat în colțul din dreapta-jos ale zonei dreptunghiulare. Macaraua ar trebui să care la un terminal toate dalele conținute în containere situate în pozițiile (i,j) pentru care i1≤i≤i2 şi j1≤j≤j2. Însă, macaraua are un defect de funcționare. Pentru fiecare comandă, atunci când ajunge la un container cu dale negre, dacă acest container nu are senzor special nu va transporta la terminal dalele conținute de acesta. După executarea unei comenzi, un robot va umple din nou containerele golite cu acelaşi număr de dale pe care le avea inițial, aceste dale având exact aceeaşi culoare cu cea inițială.

Cerința

Calculați și afișați:

a) S – Suma dalelor negre din containerele cu senzor special de pe fiecare linie.
b) M – numărul maxim de dale pe care le poate transporta macaraua la terminal din cele k comenzi diferite.
c) Comanda optimă de forma: i1 j1 i2 j2 din cele k, pentru care macaraua transportă un număr maxim de dale M aduse la terminal. Dacă sunt mai multe comenzi optime afișați-le pe fiecare în ordinea apariției lor, urmate de numărul de ordine al comenzii din cele k comenzi date.

Date de intrare

Din fișierul de intrare macara.in se citesc pe prima linie m și n reprezentând dimensiunile matricei. Se citesc apoi elementele matricei ce reprezintă numărul de dale din fiecare container. Citim apoi pe o linie separată numărul k iar pe următoarele k linii câte o comandă cu cele patru poziții : i1 j1 i2 j2

Date de ieșire

a) Pe prima linie a fișierului macara.out se afișează numărul S conform cerinței a).
b) Pe a doua linie numărul M conform cerinței b).
c) Pe următoarea linie/linii, comanda/comenzile optime de forma: i1 j1 i2 j2 urmate de numărul de ordine conform cerinței c).

Restricții și precizări

  • 1 ≤ i1 ≤ i2 ≤ m, 1 ≤ j1 ≤ j2 ≤ n, 1 ≤ m ≤ 1000, 1 ≤ n ≤ 1000, 1 ≤ k ≤ 1000
  • numărul de dale aflate într-un container ≤ 5000
  • comenzile nu sunt unice, orice comandă se poate repeta
  • se asigură 20% din punctaj pentru rezolvarea corectă a cerinței a)
  • pentru 30% din teste 1 ≤ n ≤ 250, 1 ≤ m ≤ 250, 1 ≤ k ≤ 250

Exemplu

macara.in

5 6
6 2 5 7 12 13
3 9 15 11 4 3
18 7 9 3 31 9
15 5 5 13 4 6
8 6 11 10 23 7
5
1 2 4 4
2 1 3 5
2 2 4 5
2 1 3 5 
1 3 5 5

macara.out

28
65
2 1 3 5 2
2 1 3 5 4
1 3 5 5 5

Explicație

a) Calculăm de pe fiecare linie suma dalelor din primul container cu dale negre astfel: 2+3+7+5+11=28
b) Maximul obținut din suma dalelor care ajung la terminal este 65
c) Acest maxim este obținut din trei comenzi : primele două sunt identice pe pozițiile 2 și 4
2 1 3 5 2 și 2 1 3 5 4 cu suma 3 + 9 + 15 + 4 + 18 + 7 + 9 = 65

1 3 5 5 5 – cu suma 12 + 15 + 4 + 9 + 4 + 11 + 10 = 65 și este comanda de pe poziția 5 din k = 5 comenzi inițiale date.

Numerele subliniate reprezintă dale negre care aparțin containerelor care nu pot ajunge la terminal

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 Macara:

#include <fstream>
#define NMax 5005
#define Nk 1001
using namespace std;
int a[Nk][Nk],ti1[Nk],ti2[Nk],tj1[Nk],tj2[Nk],Poz[Nk];
int i1,i2,j1,j2,n,t,m,k,nr,sp;
long long b[Nk][Nk],s,i,j,maxx;
int w[NMax];
bool ok;
int main()
{
    ifstream f("macara.in");
    ofstream g("macara.out");
    f >> m >> n;
    for(i=2;i<=NMax;i++)
     if(w[i]==0)
      {
          for(j=i*i;j<=NMax;j=j+i)
              w[j]=1;
      }
    w[1]=1;
    for(i=1;i<=m;i++)
     {
         s=0;
         ok=true;
         for(j=1;j<=n;j++)
       {
           f >> a[i][j];
           if((ok)&&(w[a[i][j]]==0))
              {
                  ok=false;
                  sp=sp+a[i][j];
                  s=s+a[i][j];
                  b[i][j]=s;
              }
           if(w[a[i][j]]==1) s=s+a[i][j], b[i][j]=s;
            else b[i][j]=s;
       }
     }
    f >> k;
    for(t=1;t<=k;t++)
      {
          f >> i1 >> j1 >> i2 >> j2;
          s=0;
          for(i=i1;i<=i2;i++)
           s=s+b[i][j2]-b[i][j1-1];
          if(s>maxx) {maxx=s; nr=1; ti1[nr]=i1; tj1[nr]=j1; ti2[nr]=i2; tj2[nr]=j2; Poz[nr]=t;}
           else if(s==maxx) {nr++; ti1[nr]=i1; tj1[nr]=j1; ti2[nr]=i2; tj2[nr]=j2; Poz[nr]=t;}
      }
    g << sp << "\n";
    g << maxx << "\n";
    for(i=1;i<=nr;i++)
        g << ti1[i] << " " << tj1[i] << " " << ti2[i] << " " << tj2[i] << " " << Poz[i] << "\n";
    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 Adresa de email.

Rezolvarea problemei #2564 Macara

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