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ă.
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țaP
ce trebuie rezolvată (1
sau2
), numărulN
de rânduri, numărulM
de coloane, şi numărulK
de becuri - pe fiecare din următoarele
K
linii, câte trei numere naturaleA B C
, separate prin câte un spaţiu, reprezentând rândulA
şi coloanaB
în care se află fiecare bec şi consumulC
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ței1
și50%
din punctaj pentru rezolvarea corectă a cerinței2
.
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; }