fbpx

Problema #2343 – bec – Rezolvari PBInfo

de Mihai-Alexandru

Enunț

Într-o pădure sunt plantați N*M copaci, pe N rânduri şi M coloane, fiecare copac aflându-se la egală distanţă de copacii vecini. Întrucât în pădure este cam întuneric, pădurarul (care supraveghează pădurea) montează K becuri (câte un bec într-un copac). Aceste becuri au consum diferit de energie electrică. Fiecare bec luminează doar o parte dintre copaci. Un copac este luminat de un bec dacă, trasând o linie dreaptă de la el la bec, niciun alt copac sau bec nu se află pe acea linie.

Enunț

Într-o pădure sunt plantați N*M copaci, pe N rânduri şi M coloane, fiecare copac aflându-se la egală distanţă de copacii vecini. Întrucât în pădure este cam întuneric, pădurarul (care supraveghează pădurea) montează K becuri (câte un bec într-un copac). Aceste becuri au consum diferit de energie electrică. Fiecare bec luminează doar o parte dintre copaci. Un copac este luminat de un bec dacă, trasând o linie dreaptă de la el la bec, niciun alt copac sau bec nu se află pe acea linie.
Energia electrică fiind scumpă, pădurarul va trebui să renunţe la K-1 becuri şi să păstreze doar becul care luminează numărul maxim C de copaci. Dacă mai multe becuri dintre cele K luminează C copaci, pădurarul îl va păstra pe cel mai util adică care are cel mai mic consum de energie electrică.


poza_bec
quick image uploader

Cerința

Să se scrie un program care să determine:
1. numărul maxim X de copaci ce pot fi luminați de unul dintre cele K becuri
2. poziția (rândul R şi coloana C) becului cel mai util păstrat de pădurar.

Date de intrare

Fișierul de intrare bec.in conține:

  • pe prima linie, patru numere naturale P N M K, separate prin câte un spaţiu, reprezentând: cerința P ce trebuie rezolvată (1 sau 2), numărul N de rânduri, numărul M de coloane, şi numărul K de becuri
  • pe fiecare din următoarele K linii, câte trei numere naturale A B C, separate prin câte un spaţiu, reprezentând rândul A şi coloana B în care se află fiecare bec şi consumul C de energie electrică a acestuia.

Date de ieșire

Dacă P=1, atunci fișierul de ieșire bec.out va conține pe prima linie numărul X ( răspunsul la cerința 1). Altfel, dacă P=2, atunci fişierul de ieşire bec.out va conţine pe prima linie cele două numere naturale R C (răspunsul la cerința 2) separate prin câte un spațiu, cu semnificația din enunț.

Restricții și precizări

  • 2 ≤ N ≤ 150; 2 ≤ M ≤ 150
  • 1 ≤ K ≤ N; 1 ≤ K ≤ M; 1 ≤ K ≤ 100
  • 1 ≤ A ≤ N; 1 ≤ B ≤ M; 1 ≤ C ≤ 10000 pentru fiecare bec
  • nu există două becuri asezate pe același rând și aceeași coloanâ
  • nu există două becuri cu același consum de energie electrică
  • se acordă 50% din punctaj pentru rezolvarea corectă a cerinței 1 și 50% din punctaj pentru rezolvarea corectă a cerinței 2.

Exemplul 1:

bec.in

1 5 4 3
2 3 80
4 2 100
4 3 70

bec.out

14 

Explicație

P=1 . Se rezolvă cerința 1.
Numerotăm copacii ca în tabloul alăturat. Primul bec, situat în rândul 2 şi coloana 3 (consum energie 80) luminează 14 copaci (nu îi luminează pe cei numerotați cu 5, 12 şi 16).
Al doilea bec, situat în rândul 4 şi coloana 2 (consum energie 100) luminează 13 copaci (nu îi luminează pe cei numerotați cu 2, 6, 7 şi 13).
Al treilea bec, situat în rândul 4 şi coloana 3 (consum energie 70) luminează 14 copaci (nu le luminează pe cei numerotați cu 3, 5 şi 12).

Exemplul 2:

bec.in

2 5 4 3
2 3 80
4 2 100
4 3 70

bec.out

4 3 

Explicație

P=2. Se rezolvă cerința 2.
Becurile ce luminează numărul maxim de copaci (X=14) sunt: 1 (consum de energie 80) și 3 (consum de energie 70). Becul 3 are consumul de energie mai mic decât cel al primului bec (70<80) și se află în rândul R=4 şi coloana C=3

#include <bits/stdc++.h>

using namespace std;

ifstream cin("bec.in");
ofstream cout("bec.out");

int A[151][151],n,m,k,p;
int X[101],Y[101],C[101];

int cmmdc(int a,int b)
{
    while(b!=0)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}

int main()
{
    cin>>p>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>X[i]>>Y[i]>>C[i];
        A[X[i]][Y[i]]=1;
    }
    int c,xmin=0,cmin=10000,cmax=0;
    for(int x=1;x<=k;x++)
    {
        c=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(A[i][j]==0 && cmmdc(abs(X[x]-i),abs(Y[x]-j))==1)
                    c++;
        if(c>cmax)
        {
            cmax=c;
            xmin=x;
            cmin=C[x];
        }
        else
            if(c==cmax && C[x]<cmin)
        {
            xmin=x;
            cmin=C[x];
        }
    }
    if(p==1)
        cout<<cmax;
    else
        cout<<X[xmin]<<" "<<Y[xmin];
    return 0;
}
Comentarii

S-ar putea sa iti placa