#1057
Considerăm un şir de numere a1, a2, …, aN. O secvenţă nevidă în acest şir este de forma ai, ai+1, …, aj, unde i ≤ j. De exemplu, pentru N=4 şi şirul 2 3 4 3, secvenţele nevide sunt: 2, 2 3, 2 3 4, 2 3 4 3, 3, 3 4, 3 4 3, 4, 4 3, 3. Definim puterea unui element ai ca fiind numărul de secvenţe care-l conţin pe ai şi în care ai este strict mai mare decât celelalte elemente ale fiecăreia dintre respectivele secvenţe. Astfel în şirul 2 3 4 3 puterea elementului a1 este 1 (fiind maxim doar în secvenţa formată din el însuşi), a elementului a2 este 2 (a2 fiind maxim în secvenţele 2 3 şi 3), a elementului a3 este 6 (fiind maxim în secvenţele 2 3 4, 2 3 4 3, 3 4, 3 4 3, 4 şi 4 3), iar a elementului a este 1.
Scrieţi un program care determină puterea cea mai mare a unui element din şirul dat, precum şi numărul de elemente din şir care au cea mai mare putere.
OJI 2013, Clasa a VIII-a
| Problema | MaxP | Operații I/O |
maxp.in/maxp.out
|
|---|---|---|---|
| Limita timp | 0.5 secunde | Limita memorie |
Total: 32 MB
/
Stivă 32 MB
|
| Id soluție | #63649405 | Utilizator | |
| Fișier | maxp.c | Dimensiune | 521 B |
| Data încărcării | 12 Martie 2026, 16:34 | Scor/rezultat | 100 puncte |
maxp.c: In function 'main': maxp.c:4:70: warning: ignoring return value of 'freopen', declared with attribute warn_unused_result [-Wunused-result] typedef long long l;static int a[N],s[N],L[N],R[N];int main(){freopen("maxp.in","r",stdin);freopen("maxp.out","w",stdout);int n,i,t=0;long long best=0,cnt=0,p;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",a+i);for(i=1;i<=n;i++){while(t&&a[s[t]]<a[i])t--;L[i]=t?s[t]:0;s[++t]=i;}for(t=0,i=n;i;i--){while(t&&a[s[t]]<a[i])t--;R[i]=t?s[t]:n+1;s[++t]=i;}for(i=1;i<=n;i++){p=(l)(i-L[i])*(R[i]-i);if(p>best)best=p,cnt=1;else if(p==best)cnt++;}printf("%lld\n%lld",best,cnt);} ^ maxp.c:4:99: warning: ignoring return value of 'freopen', declared with attribute warn_unused_result [-Wunused-result] typedef long long l;static int a[N],s[N],L[N],R[N];int main(){freopen("maxp.in","r",stdin);freopen("maxp.out","w",stdout);int n,i,t=0;long long best=0,cnt=0,p;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",a+i);for(i=1;i<=n;i++){while(t&&a[s[t]]<a[i])t--;L[i]=t?s[t]:0;s[++t]=i;}for(t=0,i=n;i;i--){while(t&&a[s[t]]<a[i])t--;R[i]=t?s[t]:n+1;s[++t]=i;}for(i=1;i<=n;i++){p=(l)(i-L[i])*(R[i]-i);if(p>best)best=p,cnt=1;else if(p==best)cnt++;}printf("%lld\n%lld",best,cnt);} ^ maxp.c:4:165: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result] typedef long long l;static int a[N],s[N],L[N],R[N];int main(){freopen("maxp.in","r",stdin);freopen("maxp.out","w",stdout);int n,i,t=0;long long best=0,cnt=0,p;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",a+i);for(i=1;i<=n;i++){while(t&&a[s[t]]<a[i])t--;L[i]=t?s[t]:0;s[++t]=i;}for(t=0,i=n;i;i--){while(t&&a[s[t]]<a[i])t--;R[i]=t?s[t]:n+1;s[++t]=i;}for(i=1;i<=n;i++){p=(l)(i-L[i])*(R[i]-i);if(p>best)best=p,cnt=1;else if(p==best)cnt++;}printf("%lld\n%lld",best,cnt);} ^ maxp.c:4:197: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result] typedef long long l;static int a[N],s[N],L[N],R[N];int main(){freopen("maxp.in","r",stdin);freopen("maxp.out","w",stdout);int n,i,t=0;long long best=0,cnt=0,p;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",a+i);for(i=1;i<=n;i++){while(t&&a[s[t]]<a[i])t--;L[i]=t?s[t]:0;s[++t]=i;}for(t=0,i=n;i;i--){while(t&&a[s[t]]<a[i])t--;R[i]=t?s[t]:n+1;s[++t]=i;}for(i=1;i<=n;i++){p=(l)(i-L[i])*(R[i]-i);if(p>best)best=p,cnt=1;else if(p==best)cnt++;}printf("%lld\n%lld",best,cnt);} ^
| Test | Timp | Mesaj evaluare | Scor posibil | Scor obținut | ||
|---|---|---|---|---|---|---|
| 1 | 0 secunde | OK. | 10 | 10 | ||
| 2 | 0 secunde | OK. | 10 | 10 | ||
| 3 | 0 secunde | OK. | 10 | 10 | ||
| 4 | 0 secunde | OK. | 10 | 10 | ||
| 5 | 0.004 secunde | OK. | 10 | 10 | ||
| 6 | 0.004 secunde | OK. | 10 | 10 | ||
| 7 | 0.008 secunde | OK. | 10 | 10 | ||
| 8 | 0.012 secunde | OK. | 10 | 10 | ||
| 9 | 0.016 secunde | OK. | 10 | 10 | ||
| 10 | 0.02 secunde | OK. | 10 | 10 | ||
| Punctaj total | 100 | |||||
www.pbinfo.ro permite evaluarea a două tipuri de probleme:
Problema MaxP face parte din prima categorie. Soluția propusă de tine va fi evaluată astfel:
Suma punctajelor acordate pe testele utilizate pentru verificare este 100. Astfel, soluția ta poate obține cel mult 100 de puncte, caz în care se poate considera corectă.