Domnul Vânt a pus pe marginea unei șosele N
centrale eoliene, dintre care unele produc energie electrică, iar altele, deocamdată, doar consumă energie. El a etichetat centralele cu numerele naturale distincte de la 1
la N
, în ordinea poziționării lor pe șosea. Fiecare centrală eoliană are la bază un ecran pe care este afișat un număr întreg, reprezentând cantitatea de energie pe care o produce (dacă numărul este pozitiv) sau pe care o consumă (dacă numărul este negativ).
Pentru a construi corect k
orașe de-a lungul acestei șosele, un arhitect trebuie să aibă în vedere că:
- fiecărui oraș îi va fi atribuit câte un grup format din centrale eoliene vecine pe șosea, toate grupurile având același număr de centrale;
- cantitatea de energie repartizată unui oraș este egală cu suma numerelor afișate pe ecranele centralelor
Domnul Vânt a pus pe marginea unei șosele
N
centrale eoliene, dintre care unele produc energie electrică, iar altele, deocamdată, doar consumă energie. El a etichetat centralele cu numerele naturale distincte de la1
laN
, în ordinea poziționării lor pe șosea. Fiecare centrală eoliană are la bază un ecran pe care este afișat un număr întreg, reprezentând cantitatea de energie pe care o produce (dacă numărul este pozitiv) sau pe care o consumă (dacă numărul este negativ).Pentru a construi corect
k
orașe de-a lungul acestei șosele, un arhitect trebuie să aibă în vedere că:- fiecărui oraș îi va fi atribuit câte un grup format din centrale eoliene vecine pe șosea, toate grupurile având același număr de centrale;
- cantitatea de energie repartizată unui oraș este egală cu suma numerelor afișate pe ecranele centralelor
eoliene din grupul atribuit; uneori este posibil ca, deocamdată, suma obținută să fie negativă; - fiecare dintre cele
N
centrale eoliene trebuie să fie atribuită unui oraș; - factorul de dezechilibru, notat cu
P(k)
, este valoarea maximă a diferenței dintre energiile repartizate oricăror două orașe diferite, dintre celek
.
Cerința
Scrieți un program care citește numărul
N
, valorile afișate pe celeN
ecrane ale centralelor eoliene și rezolvă următoarele două cerinţe:- afișează numărul
M
de moduri în care se pot grupa celeN
centrale pentru construcția corectă de orașe; - afișează numărul maxim
X
de orașe ce pot fi construite corect, dintre cele care au factorul de dezechilibru minim, precum și etichetaE
a primei centrale eoliene atribuită orașului cu cea mai mare cantitate de energie repartizată, dintre celeX
orașe; dacă sunt mai multe astfel de orașe, se ia în considerare cel care are atribuite centrale etichetate cu numere mai mari.
Date de intrare
Fișierul de intrare
wind.in
conține pe prima linie un număr naturalC
reprezentând cerința care trebuie rezolvată (1
sau2
). A doua linie a fișierului conține un număr naturalN
, cu semnificația din enunț. A treia linie din fișier conțineN
numere întregi, separate prin câte un spațiu, reprezentând valorile afișate pe celeN
ecrane ale centralelor eoliene, în ordinea poziționării acestora pe șosea.Date de ieșire
Fișierul de ieșire
wind.out
va conține pe prima linie:- dacă
C=1
, numărul naturalM
, reprezentând răspunsul la cerința1
; - dacă
C=2
, cele două numere naturaleX
șiE
, în această ordine, separate printr-un singur spațiu,
reprezentând răspunsul la cerința2
.
Restricții și precizări
2 ≤ N ≤ 100000
,N
număr natural;- Numerele afișate pe ecranele centralelor sunt numere întregi formate din cel mult nouă cifre;
- Se vor construi minimum
2
orașe; - În concurs, pentru rezolvarea cerinței 1 s-au acordat 20 de puncte, pentru rezolvarea cerinței 2 s-au acordat 70 de puncte. Pe site se acordă 10 puncte pentru exemple.
Exemplul 1
wind.in
1 12 2 4 -5 12 3 5 -6 4 5 7 -8 2
wind.out
5
Explicație
Cerința este
1
. Centralele eoliene se pot grupa câte1
, câte2
, câte3
, câte4
sau câte6
.Exemplul 2
wind.in
2 12 2 4 -5 12 3 5 -6 4 5 7 -8 2
wind.out
3 1
Explicație
Cerința este
2
. Posibilitățile de grupare:- câte
1
centrală/oraș (sumele sunt2
,4
,-5
, …,2
;P(12)=20=12-(-8)
); - câte
2
centrale/oraș (sumele sunt:6
,7
,8
,-2
,12
,-6
;P(6)=18=12-(-6)
); - câte
3
centrale/oraș (sumele sunt:1
,20
,3
,1
;P(4)=19=20-1
); - câte
4
centrale/oraș (sumele sunt:13
,6
,6
;P(3)=7=13-6)
; - câte
6
centrale/oraș (sumele sunt:21
si4
;P(2)=17=21-4
).
Astfel, factorul de dezechilibru minim este
P(3)=7
, deciX=3
. Pentru această grupare a centralelor, orașul cu cantitatea maximă de energie (13
) corespunde primului grup, care începe cu centrala etichetată cuE=1
.#include <bits/stdc++.h> using namespace std; ifstream cin("wind.in"); ofstream cout("wind.out"); int cer, n, a[100001]; long long sp[100001]; int nrdiv(int n){ int cnt = 0; for(int d = 1; d * d <= n; ++d){ if(n % d == 0) cnt+=2; if(d * d == n) cnt--; } return cnt; } void desc(int n){ long long fdezmin = 0, nro = n, mini = 1000000000000000, maxi = -1000000000000000, mm, pozmm, poz; for(int i = 1; i <= n; ++i){ if(a[i] < mini) mini = a[i]; if(a[i] > maxi) maxi = a[i], poz = i; } fdezmin = maxi - mini; pozmm = poz; for(int d = 2; d * d <= n; ++d){ if(n % d == 0){ int a = n / d; mini = 1000000000000000, maxi = -1000000000000000; for(int i = 1; i <= n; i+=a){ long long sum = sp[i + a - 1] - sp[i - 1]; if(sum < mini) mini = sum; if(sum >= maxi) maxi = sum, poz = i / a; } int fdez = maxi - mini; if(fdez < fdezmin) fdezmin = fdez, nro = d, pozmm = poz * a + 1; else if(fdez == fdezmin && nro < d) nro = d, pozmm = poz * a + 1; a = d; mini = 1000000000000000, maxi = -1000000000000000; for(int i = 1; i <= n; i+=a){ int sum = sp[i + a - 1] - sp[i - 1]; if(sum < mini) mini = sum; if(sum >= maxi) maxi = sum, poz = i / a; } fdez = maxi - mini; if(fdez < fdezmin) fdezmin = fdez, nro = n/d, pozmm = poz * a + 1; else if(fdez == fdezmin && nro < n/d) nro = n/d, pozmm = poz * a + 1; } } cout << nro << ' ' << pozmm; } int main(){ cin >> cer >> n; for(int i = 1; i <= n; ++i) cin >> a[i], sp[i] = sp[i-1] + a[i]; if(cer == 1) cout << nrdiv(n) - 1; else{ desc(n); } return 0; }
Comentarii