infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din August 14, 2007, 10:12:30



Titlul: 484 Numere 5
Scris de: Adrian Diaconu din August 14, 2007, 10:12:30
Aici puteţi discuta despre problema Numere 5 (http://infoarena.ro/problema/numere5).


Titlul: Răspuns: 484 Numere 5
Scris de: Paul-Dan Baltescu din August 14, 2007, 15:51:32
Urmatorul program ia TLE pe 8 teste:
Cod:
#include <stdio.h>

int n,x;

int main()
{
    freopen("numere5.in","r",stdin);
    freopen("numere5.out","w",stdout);
   
    int i;
    scanf("%d ",&n);
    for (i=1;i<=n*n;i++) scanf("%d ",&x);
   
    return 0;
}

La OJI nu cred ca e nevoie sa parsezi citirea.


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 14, 2007, 16:19:17
o singura intrebare de curiozitate...fara implementarea pe numere mari se poate lua maxim....?
a da... si fara long long :D. Cu alte cuvinte daca in conditii de oji cu aceste restrictii poti lua maxim fara numere mari


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Vlad din August 14, 2007, 16:28:30
Se poate rezolva foarte usor fara numere mari... dar nu intra in timp... ( in arhiva, la OJI parca asta era si solutia oficiala... )


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 14, 2007, 16:29:31
si intra in memorie?!?!? limita de memorie in arhiva e de 640 kb ....iar matricea e de 1000


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Vlad din August 14, 2007, 16:31:44
Dar nu ai nevoie decat de vector de 500000, care pe char intra.


Titlul: Răspuns: 484 Numere 5
Scris de: Florin Pogocsan din August 14, 2007, 16:33:54
Ori lucrezi pe biti si sigur intra :) , eu asa am facut si am 100


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Vlad din August 14, 2007, 16:36:01
Pe biti chiar ca nu am incercat, o sa incerc. Cu vector nu mi-a intrat in timp...


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 14, 2007, 16:38:22
a da...ce nu intelegeam e cum puteai sa declari la oji un vector de 500.000 da acuma ma uitai la enuntu initial(ca stiu ca atunci mi-a intrat pe vector) si aveai nevoie de doar 60.000 acolo. :-'


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan-Cristian Tataroiu din August 14, 2007, 16:53:36
o singura intrebare de curiozitate...fara implementarea pe numere mari se poate lua maxim....?
a da... si fara long long :D. Cu alte cuvinte daca in conditii de oji cu aceste restrictii poti lua maxim fara numere mari

Dar pentru ce ti-ar trebui numere mari? :-?


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 14, 2007, 16:55:33
pentru rezolvarea in care nu retii elementele din vector.


Titlul: Răspuns: 484 Numere 5
Scris de: Adrian Diaconu din August 15, 2007, 11:39:10
S-a marit limita de timp la 0.5 ca sa nu fie nevoie de parsare.


Titlul: Răspuns: 484 Numere 5
Scris de: alexandru andronache din August 19, 2007, 09:33:12
Imi puteti da si mie unul din testele 4,8 sau 9; pe acestea iau WA si nu vad unde e eroarea... Am luat testele oficiale si imi merge pentru toate... ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Ivan Nicolae din August 19, 2007, 09:36:03
 sincer nu cred ca o sa ti se dea vreun test..... dar daca iti merge pe "testele oficiale" vezi sa nu fie ceva de la citire.


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din August 19, 2007, 19:32:13
Cat iti da pt:

Cod:

5
0 0 0 0 0
1 2 3 4 0
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Am luat testele oficiale si imi merge pentru toate... ](*,)

Nu sunt testele de la oji.

[ps: Nu sunt testele de la OJI ]


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 23, 2007, 16:40:10
nu pricep o chestie la prob asta, in varianta cu vector. Daca il declar local in main iau 50, iar daca e global 100- ceea ce e explicabil, dar ce nu inteleg este de ce iau MLE cu 680 kb in medie daca initializez eu vectorul, si daca scot respectivul for, coboara sub 300 #-o


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Vlad din August 23, 2007, 16:52:05
Initializezi pana la un milion (sau n*n) cumva? Nu ai nevoie decat pana la min(n*n, 500000)..


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 23, 2007, 16:55:46
initializez vector doar de 500.005 si cand citesc verific sa nu sara din vector
LE: incercai si cu memset...dar la fel...anyway imi facui destui nervi azi cu prog asta in special ca e primu scris in vim si mi se intampla sa trimit aceeasi sursa si de 3 ori fara sa imi dau seama...


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Vlad din August 23, 2007, 17:00:04
Vezi sa fie char vectorul, alt tip de date nu-ti intra in 640kb..


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din August 23, 2007, 17:03:18
stiu
char
500.005*1byte~=500kb
int
500.005*4byte~=2mb
prob in sine e creca a 3-a oara cand o rezolv...da vroiam ceva mai usor pentru un first time in Vim.


Titlul: Răspuns: 484 Numere 5
Scris de: Bondane Cosmin din August 23, 2007, 17:50:31
Vezi sa fie char vectorul, alt tip de date nu-ti intra in 640kb..

Intra si tipul bool.

Citat
initializez vector doar de 500.005 si cand citesc verific sa nu sara din vector
LE: incercai si cu memset...dar la fel...anyway imi facui destui nervi azi cu prog asta in special ca e primu scris in vim si mi se intampla sa trimit aceeasi sursa si de 3 ori fara sa imi dau seama...

Incearca daca ai de ex. P[Dimensiune] sa initializezi pana la Dimensiune-1.


Titlul: Răspuns: 484 Numere 5
Scris de: Savin Tiberiu din August 27, 2007, 09:30:54
eu am luat 100 folosind mai putin de 300 kb si nu am luat calcul ca va exista un numar exclus < 500 000. In concluzie problema intra destul de lejer in memorie.


Titlul: Răspuns: 484 Numere 5
Scris de: Stan Alexandru Dan din Septembrie 03, 2007, 14:01:10
eu am facut-o prin bifarea numerelor care le gasesc in matrice si iau la ultimele 5 mle, se face altfel ? :-s


Titlul: Răspuns: 484 Numere 5
Scris de: Gabriel Bitis din Septembrie 03, 2007, 14:11:16
nu trebuie sa retii matricea.. doar bifeaza intr'un vector numerele pe care le citesti.. si dupa aceea cauti pozitia de inceput si cea de final a secventei nebifate.


Titlul: Răspuns: 484 Numere 5
Scris de: Stan Alexandru Dan din Septembrie 03, 2007, 14:29:36
asa am facut dar cum ti-am zis iau mle la 5 teste ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Gabriel Bitis din Septembrie 03, 2007, 14:44:25
vectorul e de 500000...declara'l de tip char...daca nu ai facut asta pana acum..


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din Septembrie 03, 2007, 14:46:03
si ar cam trebui sa pui declaratia in afara lu main ca sa nu mai fie nevoie sa initializezi vectoru cu 0, sau orice altceva.
Si mai este oricand varianta rezolvarii pe biti, caz in care un int de 20.000 ar fi chiar prea mult...:P


Titlul: Răspuns: 484 Numere 5
Scris de: Stan Alexandru Dan din Septembrie 03, 2007, 19:15:11
asta era... initializam cu 0 charul.... mc pt sfaturi baieti... am luat si eu 100 =D&gt;


Titlul: Răspuns: 484 Numere 5
Scris de: Farcasanu Alexandru Ciprian din Ianuarie 17, 2008, 20:04:20
Eu unul nu inteleg de ce luam vectorul pana la 500.000 avand in vedere ca numarul maxim care poate fii schimbat este 1 milion...poate careva sa-mi explice?


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Ianuarie 17, 2008, 20:10:31
Nah. Nici eu nu intelegeam ce era cu a treia precizare. Cred ca a modificat cineva enuntul. A fost modificat acum la loc. Ar trebui sa fie bine.  :P


Titlul: Răspuns: 484 Numere 5
Scris de: Andrei Grigorean din Ianuarie 17, 2008, 20:19:59
Dubioasa precizarea aia.

Apropo, stiti ca se poate O(1) memorie, nu? ;)


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Ianuarie 17, 2008, 21:52:02
Nu!  :roll: Da niste indicii... presupun ca trebuie retinute niste capete de intervale... dar nu prea imi dau seama de o solutie concreta.


Titlul: Răspuns: 484 Numere 5
Scris de: HighScore din Ianuarie 17, 2008, 22:00:03
hmm, cred ca ai putea sa calculezi suma totala din matrice(intra in long long) si sa numeri elementele lipsa. Si asa aflii suma elementelor lipsa si stii cate sunt si ca sunt consecutive.


Titlul: Răspuns: 484 Numere 5
Scris de: Andrei Grigorean din Ianuarie 17, 2008, 22:38:06
Corect.

Edit:
Stiind cate numere consecutive sunt lipsa si care e suma lor, poti afla usor intervalul cautat.


Titlul: Răspuns: 484 Numere 5
Scris de: Gabriel Bitis din Ianuarie 17, 2008, 22:43:50
Ai pus toata rezolvarea aici... ajungea ce a scris Razvan, sa mai gandeasca omu cum sa'o rezolve..


Titlul: Răspuns: 484 Numere 5
Scris de: Andrei Grigorean din Ianuarie 17, 2008, 22:46:10
Eh, pot sa editez :).

Apropo, solutia asta merge si la OJI fara numere mari. Se puteau folosi numere reale :).

Edit: Am editat mai sus, sa se mai gandeasca lumea :P


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Ianuarie 18, 2008, 09:05:31
Tot e prea mult.  :P


Titlul: Răspuns: 484 Numere 5
Scris de: matei silviu din Ianuarie 24, 2008, 21:13:17
...
Eu am facut mai simplu din mate s=n(n+1)/2 dar in cazul acesta este s=n*n*(n*n+1)/2 dar imi da eroare  :? pt ca se imparte la 0 dar nu stiu unde  ](*,)

Cod:
#include<fstream.h>
int main()
{unsigned long n,a[501][501],i,j,nr=0,dif,s,s1=0;
ifstream f("numere.in");
ofstream g("numere.out");
f>>n;
for (i=1; i<=n; i++)
for(j=1; j<=n; j++)
    {f>>a[i][j];
        if (a[i][j]==0)
        nr++;
        s1+=a[i][j];
      }
s=(n*n*(n*n+1))/2;
dif=s-s1;
i=(dif+1)/nr-1;
j=i+nr-1;
g<<i<<" "<<j;
f.close();
g.close();
return 0;
}

va rog cn imi poate zice unde am gresit?

 :'(

Editat de moderator: folositi tag-ul "code" cand postati bucati din sursa


Titlul: Răspuns: 484 Numere 5
Scris de: Alina Ene din Ianuarie 24, 2008, 23:15:20
Nu cred ca impartzi la 0, ci primesti segmentation fault.
Fisierele de intrare/iesire sunt numere5.in, numere5.out. Unde folosesti valorile salvate in matricea a? O(1) memorie e suficient.

Later edit: Codul nu compileaza fara "using namespace std" de exemplu. Formula ta nu cred ca e corecta. Pe exemplul:
Cod:
3
1 2 3
0 0 0
0 0 0

iti da 5 10 nu?



Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Fisca din Martie 13, 2008, 20:33:35
 Nu se poate publica testul 8?E singurul care nu imi merge si fiind corectare grupata,primesc doar 50 de puncte.Are valori chiar asa de mari?Multumesc!


Titlul: Răspuns: 484 Numere 5
Scris de: Gabriel Bitis din Martie 13, 2008, 20:53:47
Tu primesti TLE nu Raspuns gresit. La ce te ajuta daca stii pe ce test iti iese din timp? incearca sa mai optimizezi putin si trebuie sa'ti intre in timp.


Titlul: Răspuns: 484 Numere 5
Scris de: Anonim din Martie 30, 2008, 19:39:08
Memory limit exces pe ultimele 6 teste :(( dar nus de ce ca doar am folosit un vector char cu 500.000 de elemente ....... chiar nu mai inteleg nimik.
Daca nam voie sa postez sursa va explic cum am facut si voi imi spuneti ce am gresit daaca vreti :D
 - am declarat un vector char de 500.000 elemente
  - am citit n
  - dupaia daca n era mai mare de 500.000 initializam vectorul cu 0 pana la 500.000
   - daca era mai mic initializam vecotrul cu 0 pana la n*n
    - dupaia citeam intro variabila fiecare numar;
   - dupaia daca variabila aia nu era 0 pe elementul c[a]='1';
    -dupaia daca n*n este mai mare decat 500.000 atunci faceam un for de la 1 la 500.000 si cand intalneam un '0' ma opream si il afisam si dupaia un for de la 500.000 la 1 si cand gasea un 0 il afisa si se oprea ;
   - daca n*n era mai mic la fel faceam numai ca primul for mergea pana la n*n si al doile de la n*n ..

edit :Cred ca stiu ce e gresit .... cred ca trebuia sa merg pana la 64000 .....
Eu cred ca am procedat corect daca nu va rog sa imi ziceti si mie ce e gresit :fighting:


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan-Alexandru Stoica din Martie 30, 2008, 20:20:42
da. poti sa calculezi memoria inmultind dimensiunea fiecarui tablou cu marimea tipului de date al tabloului si adunand rezultatele [...] aici (http://www.space.unibe.ch/comp_doc/c_manual/C/CONCEPT/data_types.html#int) gasesti o lista cu dimensiunile tipurilor de date. o variabila 'long long' are 8 bytes.

te-ai uitat peste ce ti-am scris eu ieri? limita de memorie este 640KB si tu ai declarat mult mai mult, de aceea iei MLE.

cred ca ai inceput sa-ti creezi un obicei prost, intreband de fiecare data cand nu iti iese ceva. incearca sa debughezi sursele, sa cauti singur greselile, pentru ca altfel nu o sa inveti mai nimic... daca nu iese, citesteste hinuturile de pe forum si daca nici atunci nu iese, consulta solutiile oficiale. intreaba de o problema de-abia dupa ce te-ai chinuit vreo 2-3 zile la ea.
nu vreau sa sune ca un repros, ci ca un sfat, si nici nu vreau sa te descurajez in a pune intrebari. sunt convins ca prin munca, vei gasi raspunsul la multe probleme. :thumbup:


Titlul: Răspuns: 484 Numere 5
Scris de: Anonim din Martie 30, 2008, 20:45:34
Va rog eu mult bagati id meu in lista voastra pls marius_bv21 vreau si eu niste indicatii la ea sau macar spunetimi ce raspuns este la testul 6 si 9 ...... ptr ca eu cred ca este un rezultat mai mare decat vecotrul meu si de aceea este incorect raspunsul meu ....

edit : Gata sa rezolvat ... chiar ca miam creat un obicei prost de fiecare data cand nu imi iese postez mesaje pe forum  .. de acu nu o sa se mai intample


Titlul: Răspuns: 484 Numere 5
Scris de: Andrei Grigorean din Martie 31, 2008, 19:00:45
Dupa cum am vazut ca ti-au mai sugerat si altii, sfatul meu este sa te chinui mai mult singur, deoarece asa vei fi cel mai castigat. E bine sa intrebi pe forum ce nu stii, insa nu intr-o maniera excesiva.

Renunta la Borland (ai putea sa incepi folosind Dev C++) si invata sa iti faci generatoare si evaluatoare.

Spor la treaba!


Titlul: Răspuns: 484 Numere 5
Scris de: Anonim din Aprilie 03, 2008, 18:23:53
Da am invata alt limbaj si am renuntat la borland ... se vede foarte mult diferenta erau multe pr care nu imi mergeau din cauza asta iar acu imi merg dar asta nici acu nu imi merge ptr ca folosesc un vector char cu multe elemente am marit numarul de elemente pana la limita memoriei dar tot iau incorect pe 2 teste...


Titlul: Răspuns: 484 Numere 5
Scris de: Pripoae Teodor Anton din Aprilie 04, 2008, 12:22:13
Da am invata alt limbaj si am renuntat la borland ...
adica ai trecut la pascal? ca pana la urma devu e tot c++ :P deci e ac limbaj


Titlul: Răspuns: 484 Numere 5
Scris de: Anonim din Aprilie 04, 2008, 15:33:06
Nu ma refeream la asta :D ci la faptul ca nu mai folosesc citirea cu stream-uri ci cu scanf care parerea mea este de 10 ori si de aceea acu iau mai usor 100 la pr inainte aveam 10 pr incercate acu am doar 3 ..eroarea mea mam exprimat gresit :D


Titlul: Răspuns: 484 Numere 5
Scris de: Codrin LACHE din Aprilie 10, 2008, 17:25:12
nu inteleg dc imi da MLE la 3 teste  ](*,)
 am declarat vectoru bool de 500000 si in rest nu am nimic ce ar putea iesi atat din memorie si totusi nu iau decat la 70 % din teste
ajutati-ma va rog :'(
 


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan-Alexandru Stoica din Aprilie 10, 2008, 18:03:14
e declarat global? daca e declarat global, ai grija sa nu faci multe apeluri recursive.


Titlul: Răspuns: 484 Numere 5
Scris de: Catalin Ionescu din Decembrie 19, 2008, 20:51:32
am si eu o intrebare pt aceasta problema...
Restrictii
0 < N ≤ 1000
Fratele lui Mircea schimba cel putin un numar in fisier.


daca exista un singur numar transformat in 0...atunci eu afisez de 2 ori acel numar sau odata? ca imi cere capetele intervalului transformat in 0 ;)


Titlul: Răspuns: 484 Numere 5
Scris de: Flaviu Pepelea din Decembrie 19, 2008, 21:04:17
afisezi de doua ori (capetele intervalului .... si [x,x] e un interval)


Titlul: Răspuns: 484 Numere 5
Scris de: Catalin Ionescu din Decembrie 19, 2008, 21:20:44
aham mersi ;) oricum pbleme mele apar de la memorie... k imi da sigkill daca dau vectoru de bool la 1 mil... si iau 50 de puncte pt vectoru la 500.000  ](*,) vreo idee?


Titlul: Răspuns: 484 Numere 5
Scris de: Andrei Grigorean din Decembrie 19, 2008, 21:28:51
Citeste pe pagina anterioara. Se poate cu O(1) memorie.


Titlul: Răspuns: 484 Numere 5
Scris de: Danci Emanuel Sebastian din Februarie 19, 2009, 14:26:04
Help!!
Pe evaluatorul oficial am luat 90 si aici 0.Un singur test corect.
Am un vector char de 64000 si cateva variabile long.
Pe majoritatea imi da wall time limit exceded si pe 2 memory limit exceded. Unde e problema?  :fighting:


Titlul: Răspuns: 484 Numere 5
Scris de: Emanuel Cinca din Februarie 19, 2009, 14:38:16
iti trebuie vector de 500000, nu doar de 64000...si ai grija sa te foloseste de min(n*n, 500000)...


Titlul: Răspuns: 484 Numere 5
Scris de: Danci Emanuel Sebastian din Februarie 19, 2009, 14:53:52
cu vectorul de 500000 imi iese din timp!


Titlul: Răspuns: 484 Numere 5
Scris de: Danci Emanuel Sebastian din Februarie 19, 2009, 14:54:22
Am incercat si bool si char!


Titlul: Răspuns: 484 Numere 5
Scris de: gaboru corupt din Februarie 19, 2009, 15:12:17
incearca sa faci citirea cu scanf si afisarea cu printf... eu asa am scos 100. cu stringuri mie cel putin nu imi mergea


Titlul: Răspuns: 484 Numere 5
Scris de: Danci Emanuel Sebastian din Februarie 19, 2009, 15:14:28
cu scanf si printf am facut-o


Titlul: Răspuns: 484 Numere 5
Scris de: gaboru corupt din Februarie 19, 2009, 15:21:37
hmmm... defapt iti trebuie vector de 500 002. eu luam 50 de pct cu 2 MLE cu vector de 500 001... cat despre cautarea celor doua capete ale intervalului, daka faceam cu while avea incorect pe 2 teste. am schimbat in for si luam 100. poti incerca, nu asigur ca din aia... oricum problema ii la memorie, ca e foarte la limita


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Februarie 19, 2009, 15:23:31
Vezi ca atunci cand verifici aparitia numerelor, sa verifici doar aparitia acelor numere mai mici decat 500.000. Tu probabil mergi pana la n*n. Mie mi-a mers si o rezolvare cu un vector char[] de 500.000 de elemente. Spor!

ps: Vezi ca problema se poate rezolva si fara vector. [hint: gandeste-te la suma totala din fisier]


Titlul: Răspuns: 484 Numere 5
Scris de: Emanuel Cinca din Februarie 19, 2009, 15:38:00
eu am folosit vector bool de 500000 si marcam sumele gasite pana la n*n sau mai mici decat 500000... apoi am parcurs acel vector o data de la inceput si o data de la sfarsit pentru a afla capetele intervalului [x,y] :)


Titlul: Răspuns: 484 Numere 5
Scris de: gaboru corupt din Februarie 19, 2009, 15:47:11
@manu... dupa ce ai zis cum faci tu, acum probabil toti vor lua 100 fara problema. prea evident cum se rezolva problema. nu mai are farmec sa o gandesti, citesti forumul si gata. fi mai putin explicit  :D


Titlul: Răspuns: 484 Numere 5
Scris de: Danci Emanuel Sebastian din Februarie 20, 2009, 12:55:21
Pana la urma mi-o mers cu un bool de 500004


Titlul: Răspuns: 484 Numere 5
Scris de: gaboru corupt din Februarie 20, 2009, 23:22:25
Citat
ps: Vezi ca problema se poate rezolva si fara vector. [hint: gandeste-te la suma totala din fisier]

nu prea vad cum as putea scoate capetele intervalului din suma totala. un hint ceva ?

LE: nu conteaza, am prins ideea


Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Schnakovszki din Februarie 24, 2009, 12:11:10
Se pare ca evaluatorul se face de ras la problema asta ...
Am trimis o sursa, am luat asa : http://infoarena.ro/job_detail/265716
Am mai trimis odata ACEEASI sursa, am luat asa : http://infoarena.ro/job_detail/265717
Am mai trimis inca odata ACEEASI sursa, am luat asa : http://infoarena.ro/job_detail/265718



Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan-Cristian Tataroiu din Februarie 24, 2009, 13:13:26
Evaluatorul e foarte ok, cand o sa rulezi un program niciodata n-o sa-ti mearga exact la fel cand accesezi memorie prost. In programul tau ai doua while-uri in care iterezi dupa i si i poate sa depaseasca limitele vectorului. Depinde de sistemul de operare sa-ti opreasca programul cand o ia razna cum face al tau pe teste mari si momentul in care ti-l opreste depinde de ce zona de memorie accesezi prost.

Aici sursa ta ia 100, dupa ce corectezi while-urile: http://infoarena.ro/job_detail/265753

As a side note: poti sa iei memory limit exceded si cand trebuie sa iei killed by signal 11.


Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Schnakovszki din Februarie 24, 2009, 22:08:54
Evaluatorul e foarte ok, cand o sa rulezi un program niciodata n-o sa-ti mearga exact la fel cand accesezi memorie prost. In programul tau ai doua while-uri in care iterezi dupa i si i poate sa depaseasca limitele vectorului. Depinde de sistemul de operare sa-ti opreasca programul cand o ia razna cum face al tau pe teste mari si momentul in care ti-l opreste depinde de ce zona de memorie accesezi prost.

Aici sursa ta ia 100, dupa ce corectezi while-urile: http://infoarena.ro/job_detail/265753

As a side note: poti sa iei memory limit exceded si cand trebuie sa iei killed by signal 11.

Intr-adevar era gresita conditia in whileuri. Scuze ca m-am luat de evaluator, nu mi-am dat seama ca acolo iasa :) Mersi pt sfat  :winner1:


Titlul: Răspuns: 484 Numere 5
Scris de: Chibici Tiberiu din Martie 08, 2009, 14:35:53
Salutare
Am rezolvat problema, dar am luat doar 50 puncte pentru ca pentru 2 teste raspunsul e incorect  ](*,) ](*,) ](*,). De ce???
Cod:
#include <fstream>

using namespace std;

bool nr[250001];

int main()
{
        int n,i,j,temp;
        int min, max;
        ifstream in ("numere5.in");
        in>>n;

        for (i=0;i<n;i++)
            for (j=0;j<n;j++) {
                in>>temp;
                if (temp>0 && temp<250001) nr[temp]=true;
            }

        for (i=1;i<=n*n && i<250001;i++)
            if (nr[i]==false) {min=i; break;}
        while (nr[i]==false && i<250001) i++;
        max=i-1;

        in.close();
        ofstream out ("numere5.out");
        out<<min<<" "<<max;
        out.close();

        return 0;
}


UPDATE: m-am prins acum ca limita era 500 000 nu 250 000, ca eu aveam subiectele de la concurs, nu m-am uitat la cerinta de aici, dar problema e limita de memorie in care nu ma incadrez daca modific..


Titlul: Răspuns: 484 Numere 5
Scris de: Emanuel Cinca din Martie 08, 2009, 14:42:21
Citat
Numerele schimbate de fratele lui Mircea sunt mai mici sau cel mult egale cu 500.000

tu ai pus doar 50.001

LE:
Cod:
bool nr[500001];

si ar trebui sa te incadrezi


Titlul: Răspuns: 484 Numere 5
Scris de: Pavel Razvan din Martie 11, 2009, 16:44:58
Ce trebuie afisat pentru N=1 ?


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Martie 11, 2009, 16:51:29
Exact ce iti cere problema.  :) Fii atent si la a doua restrictie.  :)


Titlul: Răspuns: 484 Numere 5
Scris de: Pavel Razvan din Martie 11, 2009, 17:01:53
multumesc  :D


Titlul: Răspuns: 484 Numere 5
Scris de: Usurelu Catalin din Aprilie 21, 2009, 21:22:15
Deci e incredibil, imi da MLE la 3 teste si programu e facut perfect. Nu inteleg de ce depasest in halul asta limita.
Macar daca era limita de 660 KB era bine.


Titlul: Răspuns: 484 Numere 5
Scris de: Usurelu Catalin din Aprilie 21, 2009, 22:34:04
Va rog sa mariti limita la 660 Kb, sau daca nu sa imi spuneti ce e gresit in sursa mea de are 3 MLE-uri:
Cod:
#include <fstream.h>   
#define min(a,b) a<b?a:b   
 
ifstream f("numere5.in");   
ofstream g("numere5.out");   
 
int n;   
char v[500001];   
long limita;   
 
void citire ()   
{ long aux;   
 f>>n;   
 limita=min(n*n,500000);   
  for (short int i=1; i<=n; i++)   
   for (short int j=1; j<=n; j++)   
    { f>>aux; if (aux<=limita) v[aux]=1; }   
  f.close ();   
}   
 
int main ()   
{ citire ();     
  long i=1;   
  while (v[i]) i++;   
  g<<i<<" ";   
  i=limita;   
   
while (v[i]) i--;   
  g<<i;   
  g.close ();   
  return 0;   


[editat de moderator] foloseste tagul code cand postezi cod sursa.


Titlul: Răspuns: 484 Numere 5
Scris de: Mihai Calancea din Aprilie 22, 2009, 07:18:38
Pai in mod evident foloseste prea multa memorie  :)

Uita-te prin restul topicului . Poti gasi multe solutii la aceasta problema  si chiar una care ruleaza in O(1) memorie   :weightlift:


Titlul: Răspuns: 484 Numere 5
Scris de: Andrici Cezar din Aprilie 22, 2009, 18:34:27
Va rog sa mariti limita la 660 Kb, sau daca nu sa imi spuneti ce e gresit in sursa mea de are 3 MLE-uri:
Cod:
#include <fstream.h>   
#define min(a,b) a<b?a:b   
 
ifstream f("numere5.in");   
ofstream g("numere5.out");   
 
int n;   
char v[500001];   
long limita;   
 
void citire ()   
{ long aux;   
 f>>n;   
 limita=min(n*n,500000);   
  for (short int i=1; i<=n; i++)   
   for (short int j=1; j<=n; j++)   
    { f>>aux; if (aux<=limita) v[aux]=1; }   
  f.close ();   
}   
 
int main ()   
{ citire ();     
  long i=1;   
  while (v[i]) i++;   
  g<<i<<" ";   
  i=limita;   
   
while (v[i]) i--;   
  g<<i;   
  g.close ();   
  return 0;   


[editat de moderator] foloseste tagul code cand postezi cod sursa.

Tu cred ca nu ai observat ca scrie ca sunt cifre consecutive
Acest lucru te avantajeaza.
Gandestete ca ai sirul
1 0 0 0 5 6 7 8 9

Suma cifrelor prezente este 36
Sunt 3 numere absente
Suma sirului este 45

Pentru exemplu
Cod:
a=suma_sirului - suma_cifrelor_prezente; //a=9
b=numarul_de_cifre_absente; //b=3
x=(a-(b*b+b)/2)/b; //x=1
pozitie_inceput=x+1; // pi=2
pozitie_final=x+b; //pf=4

:D
sper sa iti foloseasca


Titlul: Răspuns: 484 Numere 5
Scris de: Codrin LACHE din Aprilie 28, 2009, 19:53:23
 ](*,) ](*,) ](*,) pffffffff
deci am facut-o in doua moduri...

1. cu vector de 500.000 imi iese la 3 teste din memorie desi pe forum zice lumea ca le-a intrat:

Cod:
#include<fstream.h>

char a[500005];

int main()
{
 ifstream fin("numere5.in");
 ofstream fout("numere5.out");
 long i,n,aux,auxi;
 fin>>n;
 aux=n*n;
 if(aux>500000)
aux=500000;
 for(i=1;i<=aux;i++)
{
fin>>auxi;
if(auxi)
a[auxi]=1;
}
 for(i=1;i<=aux;i++)
if(a[i]==0)
{
fout<<i<<" ";
break;
}
 for(i=aux;i>=1;i--)
if(a[i]==0)
{
fout<<i<<"\n";
break;
}
return 0;
}

2. cu sume si iau incorect pe 4 teste si cu formula chiar cea de mai sus pentru capetele de interval

Cod:
#include<fstream.h>

int main()
{
 ifstream fin("numere5.in");
 ofstream fout("numere5.out");
 long i,n,aux,auxi,suma=0,sumb=0,a,b=0,x;
 fin>>n;
 aux=n*n;

 if(aux>500000)
aux=500000;

 for(i=1;i<=aux;i++)
{
suma+=i;
fin>>auxi;
if(auxi)
sumb+=auxi;
else
b++;
}

 a=suma-sumb;
 x=(a-(b*b+b)/2)/b;

 fout<<x+1<<" "<<x+b;

 fin.close();
 fout.close();

return 0;
}

deci pe bune nu stiu care e greseala in niciuna dintre ele dar ma frustreaza 0-ul  :fighting: :fighting: :fighting:


Titlul: Răspuns: 484 Numere 5
Scris de: Andrici Cezar din Aprilie 29, 2009, 08:19:32
Pai la varianta a doua vezi ca tu trebuie sa stii cate numere nu sunt, si suma celor care sunt si inca ceva suma aia care creste cu i este egala cu suma=(n*n*n*n+n*n)/2  .. Si apoi faci ce ti-am zis:D  :)

Ai incercat sa pui 500001?


Titlul: Răspuns: 484 Numere 5
Scris de: Codrin LACHE din Aprilie 29, 2009, 18:41:17
nu inteleg ce vrei sa spui...ce nu e corect mai exact la varianta a doua??
suma=suma numerelor de la 1 la n(da ma rog are si formula n(n+1)/2 dar nu e asta marea problema)
sumb=suma numerelor care sunt
b=cate nu sunt
a=suma celor care nu sunt

ce imi mai trebuie in afara astora?


Titlul: Răspuns: 484 Numere 5
Scris de: Andrici Cezar din Aprilie 29, 2009, 19:05:43
vezi ca 50000*500000 depaseste long trebuie sa pui long long  :ok: scz la inceput eram cam somnoros  :oops: am testat sursa ta cu long long si ia 100;) noroc in continuare


Titlul: Răspuns: 484 Numere 5
Scris de: Codrin LACHE din Aprilie 29, 2009, 19:11:49
pfff...corect...uitasem de asta ](*,) ](*,) :thumbdown: :thumbdown:
ms fain  :peacefingers:


Titlul: Răspuns: 484 Numere 5
Scris de: zloteanu adrian nichita din Mai 01, 2009, 13:01:10
http://infoarena.ro/job_detail/309913
chiar am nevoie de ajutor
am lucrat 5 ore azi la ea si tot nu functioneaza ](*,) ](*,) ](*,) ](*,) ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Ionescu Robert Marius din Mai 01, 2009, 13:07:18
nu e open source, deci nu pot sa vad cum ai facut, poti incerca sa lucrezi pe biti, sau sa incerci cu hasuri, ma gandesc ca intra in memorie asa


Titlul: Răspuns: 484 Numere 5
Scris de: zloteanu adrian nichita din Mai 01, 2009, 15:15:34
nu siu ce inseamna sa lucrezi pe biti :'( :'( :'(
oricum,uite sursa


Titlul: Răspuns: 484 Numere 5
Scris de: Mitu Florin Danut din Mai 11, 2009, 17:17:31
Buna! Va rog sa ma ajutati si pe mine! Lucrez la problema asta de ceva vreme. Am facut un cod simplu dar nu imi dau seama de ce primesc 4 TLE pe ultimele teste cand practic eu fac doar un for pana la n*n. Lucrez in pascal. Iata codul:

         
Cod:
# program pascal;  
#   var f,g:text; n,x,nr,s,nr2,dif,p,sl:int64; j,i:longint; 
#   begin 
#   assign(f,'numere5.in'); reset(f); 
#   assign(g,'numere5.out'); rewrite(g); 
#   readln(f,n); 
#   sl:=0;  nr:=0; 
#   for i:=1 to n*n do 
#            begin 
#            read(f,x); 
#            if x=0 then nr:=nr+1; 
#            sl:=sl+x; 
#            end; 
# n:=n*n; 
# s:=(n*(n+1)) div 2; 
# dif:=s-sl; 
# nr2:=nr-1; 
# p:=nr2*(nr2+1) div 2; 
# dif:=dif-p; 
# i:=dif div nr; 
# j:=i+nr2; 
# write(g,i,' ',j); 
# close(f); 
# close(g); 
# end. 

HELP ME, PLEASE!!!!  :D :)


Titlul: Răspuns: 484 Numere 5
Scris de: Andrici Cezar din Mai 11, 2009, 17:18:50
vezi daca n*n>500000 sa reintializezi n*n cu 500000 ;) si asa ar trebui sa iti mearga


Titlul: Răspuns: 484 Numere 5
Scris de: Mitu Florin Danut din Mai 11, 2009, 17:25:24
multumesc mult cezar! foarte repede ai raspuns! am luat in sfarsit 100 :winner1:  iti multumesc tare mult!


Titlul: Răspuns: 484 Numere 5
Scris de: Bacer Andrei din Mai 16, 2009, 08:31:07
Am si eu o nedumerire. Deci eu fac in felul urmator: calculez suma primelor n*n numere cu formula n*n*(n*n+1)/2, apoi in timp ce citesc numerele le fac suma si aflu cate din ele sunt egale cu 0. Aflu prin diferenta suma numerelor lipsa (sa zicem dif). Stiind ca acestea sunt consecutive ele vor avea forma a , a+1, a+2, ... , a+nr-1 (unde nr reprezinta numarul valorilor egale cu 0). Asadar primul numar va fi egal cu [dif-(nr*(nr-1)/2)]/nr, iar ultimul egal cu primul+nr-1. Cu toate acestea...pe 9 teste obtin mesajul incorrect. Imi poate spune va rog cineva ce este gresit in rationamentul meu?  ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Pripoae Teodor Anton din Mai 16, 2009, 08:48:54
Iti trebuie long long.


Titlul: Răspuns: 484 Numere 5
Scris de: Bacer Andrei din Mai 16, 2009, 09:03:33
Cu exceptia lui n toate variabilele ce intervin in programul meu sunt declarate long long :roll:


Titlul: Răspuns: 484 Numere 5
Scris de: Pripoae Teodor Anton din Mai 16, 2009, 09:33:53
Trebuie sa faci cast la long long, daca ai sa zicem s long long si n int, si vrei sa faci s = n * n * (n -1), trebuie s = 1LL * n * n * (n -1).


Titlul: Răspuns: 484 Numere 5
Scris de: Bacer Andrei din Mai 16, 2009, 09:51:07
Mii de multumiri Toni am reusit sa iau 100 :yahoo:

O informatie foarte utila pe viitor :aha:


Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Eugen Dornescu din Decembrie 17, 2009, 12:37:50
Cod:
#include<iostream>
#include<fstream>

using namespace std;

ifstream f("numere5.in");
ofstream g("numere5.out");

int n;
char v[500001];
long int x,i,m;

int main()

{  

f>>n;

if(n*n>500000)
m=500000;
else
m=n*n;

    for(i=1;i<=m;i++)
{
f>>x;
   v[x]=1;
}


    for(i=1;i<=m;i++)
{
        if(v[i]==0 && v[i-1]==1)
   g<<i<<" ";
if(v[i]==0 && v[i+1]==1)
   g<<i;
}
return 0;
}

un WA pe testul 9, si 4 MLE. Imi spuneti si mie ce e gresit va rog?:(


Folosesti prea multa memorie. Incearca fara vector.  :)

pai cum se face fara vector? la comentarii scriau toti ca au facut cu vector

[editat de moderator] ai postat consecutiv...


Titlul: Răspuns: 484 Numere 5
Scris de: Florian Marcu din Decembrie 17, 2009, 12:39:13
Poti face si cu vector. Am gresit eu. Uite, aici:
Citat
   for(i=1;i<=m;i++)
   {
      f>>x;
       v
  • =1;
   }
x poate fi mai mare de 500.000. Pune conditie!  :) Mai citeste o data formatul datelor de intrare.


Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Eugen Dornescu din Decembrie 17, 2009, 12:43:03
nu inteleg, de ce iau Memory Limit Exceeded, ce gresesc?
am dat m=n*n si iau killed by signal 11 pe unul, pe restul mle
am pus long long la toate si iau mle


int n;
char v[500001];
long long m;
long int i,x;


//nu va mai deranjati sa raspundeti ca am aflat greseala/greselile


Titlul: Răspuns: 484 Numere 5
Scris de: Lodoaba Sorin din Martie 02, 2010, 17:47:52
shirul de nr incepe de la 1.. ?


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 02, 2010, 17:50:19
Da, de la 1 la N*N


Titlul: Răspuns: 484 Numere 5
Scris de: Lodoaba Sorin din Martie 02, 2010, 19:54:55
poate sa imi spuna cineva de ce nu primesc mai multe puncte??
Cod:
program num5;
const r=1;
type vec=array [1..1000000] of word;
var i,n:longint;
    st,s0,s,sfi:longint;
    k:integer;
    a1,an:longint;
    a:vec;
    f,t:text;
begin
  assign(f,'numere5.in');
  reset(f);
  assign(t,'numere5.out');
  rewrite(t);
  read(f,n);
  n:=n*n;
  for i:=1 to n do
    read(f,a[i]);
  {-----------------------}
  k:=0;s:=0;
  for i:=1 to n do
    if a[i]=0 then k:=k+1
      else S:=s+a[i];
  a1:=1;
  an:=n;
  st:=((n+1)*n) div 2;
  S0:=St-S;
  sfi:=S0*2 div k;
  a1:=(sfi-(k-1)) div 2;
  an:=a1+(k-1);
  {-----------------------}
  write(t,a1,' ',an);
  close(f);
  close(t);
end.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 02, 2010, 20:21:31
Pentru ca a1,ak si probabil sumele pot depasi longint, incearca int64


Titlul: Răspuns: 484 Numere 5
Scris de: Petrican Teodor din Martie 04, 2010, 17:34:19
Nu e bine... fac problema asta cu un vector de 500000 de booleene, calculez in timpul citirii cate au valoarea 0, aflu cu un for limita initiala si scriu limita initiala si limita finala care o calculez cu ajutorul contorului care memoreaza cate au valoarea 0.

Luam TLE pe 2 teste, asta este. Chestia ciudata e ca acum, cu exact aceeasi sursa iau TLE pe 4 teste...
http://infoarena.ro/job_detail/391836
http://infoarena.ro/job_detail/410949
 :readthis:

Ce are?  #-o

Am inteles ca nu imi intra in timp asa, dar m-am gandit totusi ca e ciudat cum odata luam 2 TLE-uri si acum iau 4 si ca merita postat pe forum.


Titlul: Răspuns: 484 Numere 5
Scris de: Dragos-Alin Rotaru din Martie 04, 2010, 17:37:09
Sursa ta e la limita cu timpul. Gaseste o solutie mai eficienta pentru a luat punctaj maxim.


Titlul: Răspuns: 484 Numere 5
Scris de: Zethpix din Martie 04, 2010, 17:45:22
Testul 6 e mai special sau cv de genul
am incercat prima oara cu suma si apoi cu vector de bool :fighting:
si testul asta il pic mereu
Cod:
#include <stdio.h>
long nr,x,i,n,j,a;
unsigned long s,sn,ds;
int main(){
FILE *f,*g;
f=fopen("numere5.in","r");
g=fopen("numere5.out","w");
fscanf(f,"%ld",&n);
s=1;
nr=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
fscanf(f,"%ld",&x);
if(x==0) nr++;
else
s+=x;
}
n*=n;
sn=(n*(n+1))/2;
sn++;
ds=sn-s;
a=(2*ds-nr*nr-nr)/(2*nr);
fprintf(g,"%ld %ld\n",a+1,a+nr);
fclose(f);
fclose(g);
return 0;
}
help pls


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 04, 2010, 19:18:40
Nu stiu,probabil unele variabile ies din limita, incearca long long.


Titlul: Răspuns: 484 Numere 5
Scris de: Zethpix din Martie 04, 2010, 20:24:40
am incercat si tot nu vrea  ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Gabriel Bitis din Martie 04, 2010, 21:19:28
Nu cred ca iti dau bine calculele pe testul :
2
1 2
3 0

Daca am calculat eu bine, obtii ceva de genul:
nr = 1;
s = 6;
n *= n ; n = 4
sn = 10;
sn++ ; sn = 11;
ds = sn - s; ds = 5;
a = (2 * 5 - 1 - 1) / 2; a = 4;
=> afisezi a+1 si a+1 deci 5 5.
Am gresit eu undeva la calcule?

O alta idee, pe care am luat eu 100, e sa marchezi toate numerele intalnite pana la 500 000 si apoi sa gasesti primul si ultimul numar nemarcat.



Titlul: Răspuns: 484 Numere 5
Scris de: Petrican Teodor din Martie 05, 2010, 13:43:51
O alta idee, pe care am luat eu 100, e sa marchezi toate numerele intalnite pana la 500 000 si apoi sa gasesti primul si ultimul numar nemarcat.

Chestia ciudata e ca aceeasi idee aplic si eu. Si totusi primesc TLE...   :sad:
Poate fi de la FPC?  :-k


Titlul: Răspuns: 484 Numere 5
Scris de: Zethpix din Martie 05, 2010, 16:26:46
eu initializez s=1
in fine chestia asta nu era necesara dar pe parcurs am incrementat sn


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 05, 2010, 17:40:27
Zimi cat iti da pe testul asta (http://www.2shared.com/file/11869167/ecc0e90a/test.html)


Titlul: Răspuns: 484 Numere 5
Scris de: Zethpix din Martie 05, 2010, 18:04:54
imi afiseaza 2005 50000
m-am uitat pe test.in si cred ca e corect


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 05, 2010, 18:22:58
Nu stiu ce sa zic, ia testele de la OJI si verifica-le pe toate ...


Titlul: Răspuns: 484 Numere 5
Scris de: Zethpix din Martie 05, 2010, 18:46:09
le-am verificat pe toate si imi da corect


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 05, 2010, 19:04:16
Verifica pentru cazul cand lipseste doar un numar ...


Titlul: Răspuns: 484 Numere 5
Scris de: Idomir Alin din Martie 23, 2010, 23:44:10
Am luat doar 50 de puncte. Am eroare mle la 4 teste. Asta dupa ce am declarat global vectorul.Stie cineva cum sa rezolv?  :-k


Titlul: Răspuns: 484 Numere 5
Scris de: Idomir Alin din Martie 24, 2010, 00:34:13
Am luat doar 50 de puncte. Am eroare mle la 4 teste. Asta dupa ce am declarat global vectorul.Stie cineva cum sa rezolv?  :-k

Am declarat long long n,i si x si mai imi da eroare pe ultimul test tle


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 09:12:56
Cat de mare ai declarat vectoru si de ce tip l-ai declarat? Pune-mi aici toate declararile tale .


Titlul: Răspuns: 484 Numere 5
Scris de: Idomir Alin din Martie 24, 2010, 10:11:03
Am declarat o data global: char v[1000005]; int i,n,x,min,max; si am luat mle pe ultimele 4 teste. Daca le declar local, iau killed by signal pe testele 6,9,10. Am facut problema cu un vector in care retin ca vizitate elementele pe care le citesc. Trebuie gasita alta solutie ca sa iau 100?


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 10:23:17
Daca te-ai uita la enunt ai vedea asta :
Citat
Numerele schimbate de fratele lui Mircea sunt mai mici sau cel mult egale cu 500.000 .
Deci cred ca vectorul ala l-ai putea mici, daca faci cu varianta lui Gabriel Bitis, si eventual facut bool, sau daca nici asa nu intra incearca asa:
Cod:
#include <bitset>
bitset<500001> x;
Asta e totuna cu bool x[500001], doar memoria e mult mai mica.


Titlul: Răspuns: 484 Numere 5
Scris de: Mihai Calancea din Martie 24, 2010, 10:37:53
Daca te-ai uita la enunt ai vedea asta :
Citat
Numerele schimbate de fratele lui Mircea sunt mai mici sau cel mult egale cu 500.000 .
Deci cred ca vectorul ala l-ai putea mici, daca faci cu varianta lui Gabriel Bitis, si eventual facut bool, sau daca nici asa nu intra incearca asa:
Cod:
#include <bitset>
bitset<500001> x;
Asta e totuna cu bool x[500001], doar memoria e mult mai mica.

L-ar putea mici ?  8)


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 10:39:22
Da, adica sa-l fac mai mic, el l-a declarat initial de 1 milion.


Titlul: Răspuns: 484 Numere 5
Scris de: Idomir Alin din Martie 24, 2010, 15:53:14
Am facut cum ai zis si imi da la ultimele 5 teste killed by signal 11.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 17:54:29
Explica-mi metoda.


Titlul: Răspuns: 484 Numere 5
Scris de: Vlad Eugen Dornescu din Martie 24, 2010, 17:57:28
Am facut cum ai zis si imi da la ultimele 5 teste killed by signal 11.

Metoda ta e buna
Cere ajutor de la oricine de pe site, dar in niciun caz de la 'Simoiu Robert'.
No offence.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 18:01:13
Am facut cum ai zis si imi da la ultimele 5 teste killed by signal 11.

Metoda ta e buna
Cere ajutor de la oricine de pe site, dar in niciun caz de la 'Simoiu Robert'.
No offence.
Bine, uite cine vorbeste ...  :eyebrow: , hai ca deja suntem OFF. Alin, incearca testele de la OJI.


Titlul: Răspuns: 484 Numere 5
Scris de: alexandru din Martie 24, 2010, 18:27:34
Nu pot sa inteleg de ce primesc kill by signal 11 , pe totate testele mele merge perfect  ](*,)


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 24, 2010, 18:42:03
Incearca testele OJI, care sunt aici (http://infoarena.ro/downloads?action=download&file=oji2005.zip&safe_only=false)


Titlul: Răspuns: 484 Numere 5
Scris de: alexandru din Martie 24, 2010, 18:44:22
Am gasit ce era, cand marcam eu consideram ca un numar apartie intre [ 1, 500 000 ] nu [ 1, 1000000 ]. :)


Titlul: Răspuns: 484 Numere 5
Scris de: Paul-Dan Baltescu din Martie 24, 2010, 23:16:18
@Simoiu Robert & Dornescu Vlad

Ar trebui sa incetati amandoi. Fiecare aveti cate un - la karma pentru tot al doilea post si aveti destul de multe posturi raportat la data in care v-ati inscris pe site. E destul de clar ca cel mai des spuneti aberatii amandoi. Ar trebui sa va mai opriti din postat intr-una, sa ajutati doar atunci cand sunteti siguri ca sunteti in masura sa faceti asta si sa acordati o mare atentie celor spuse, fie ca cereti sau ca dati sfaturi.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 25, 2010, 09:09:25
Dar eu l-am ajutat pe Idomir Alin, poate sa va spuna si el cand intra ...


Titlul: Răspuns: 484 Numere 5
Scris de: Preda Rares Mihai din Martie 28, 2010, 14:19:57
Nu intelg de ce la testele 5, 7 si 8 primesc Memory limit exceeded ca eu am impresia ca ma incadrez in memorie

<code>
Cod:
#include<fstream>
using namespace std;

ifstream fin("numere5.in");
ofstream fout("numere5.out");

bool a[500004];

int main()
{
long c, i, n, b;
fin>>n;

b=n*n;
if(b>500003)
b=500003;

for(i=1; i<=n*n; i++)
{
fin>>c;
if(c<=500003)
a[c]=true;
}
fin.close();

for(i=1; i<=b; i++)
if(a[i]==0)
{
fout<<i<<" ";
i=n*n+3;
}

for(i=b; i>0; i--)
if(a[i]==0)
{
fout<<i;
i=0;
}

fout.close();
return 0;
}
</code>    

Multumesc anticipat pentru ajutor!

Editat de moderator: foloseste tagurile [ code] si [ /code] cand postezi cod, nu <code> </code>.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Martie 28, 2010, 18:25:51
Incearca in loc de
Cod:
bool a[500004];
asta :
Cod:
bitset<1000001>a
Si trebuie inclus headerul <bitset>; .


Titlul: Răspuns: 484 Numere 5
Scris de: Pripoae Teodor Anton din Martie 28, 2010, 19:21:25
Merge si vector < bool >.


Titlul: Răspuns: 484 Numere 5
Scris de: Preda Rares Mihai din Martie 29, 2010, 10:20:06
Asa merge. Multumesc mult !  :yahoo: =D&gt;


Titlul: Răspuns: 484 Numere 5
Scris de: etg wea tw din Iunie 22, 2010, 14:54:56
 ](*,) ](*,)
Cod:
#include<stdio.h>
int main()
{int n,i,j;
freopen("numere5.in","r",stdin);
freopen("numere5.out","w",stdout);
scanf("%d",&n);
n=n*n;
char v[500001];
for(i=1;i<=n;i++)
{scanf("%d",&j);
if(j<=500000)
v[j]='1';}
if(500000<n)
n=500000;
for(i=1;i<=n;i++)
if(v[i]!='1')
{printf("%d ",i);
i=n+1;}
for(j=n;j>=1;j--)
if(v[j]!='1')
{
printf("%d",j);
j=0;
}
return 0;}

ce e gresit la sursa asta???imi da la 2 teste memory limit exeeded

Editat de admin: Foloseste tagul "code" atunci cand postezi surse.


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Iunie 22, 2010, 15:34:29
Incearca in loc de
Cod:
char v[500001];
asta :
Cod:
bitset<500001>v
Si trebuie inclus headerul <bitset>; .


Titlul: Răspuns: 484 Numere 5
Scris de: truenight din Februarie 13, 2011, 02:12:12
Sursa mea pica la 3 teste. Ma poate ajuta cineva? Multumesc!
Cod:

#include <stdio.h>

#define IN "numere5.in"
#define OUT "numere5.out"
#define N 60000

char v[N + 1];

int main(void) {

    long a, i, n, m;

    for(i = 1; i <= N; ++i) v[i] = 0;

    freopen(IN, "r", stdin);
    freopen(OUT, "w", stdout);

    scanf("%ld", &n);

    m = n * n;
    while(m--) { scanf("%ld", &a); if(a <= N) ++v[a]; }

    for(i = 1; v[i] && i <= n * n; ++i) ;
    printf("%ld ", i);

    for(; !v[i] && i <= n * n; ++i) ;
    printf("%ld", --i);

    return 0;
}


Titlul: Răspuns: 484 Numere 5
Scris de: Simoiu Robert din Februarie 13, 2011, 13:09:57
Pune in loc de N = 60.000, N = 500.000, si ar trebui sa mearga ;). Si daca nu intra in memorie, incearca variantele de mai sus.


Titlul: Răspuns: 484 Numere 5
Scris de: Cristian Lambru din Mai 03, 2011, 23:04:43
In sfarsit mi-a dat si mie cu memorie O(1) :) ! E una dintre probleme "mici" de la care ai ce invata.


Titlul: Răspuns: 484 Numere 5
Scris de: Salajan Razvan din August 10, 2011, 11:42:15
pt vectorul de marcare puneti limita 1000000...primeam diferite raspunsuri, cand aveam limita 500000: killed by signal , time limit, memory limit iar dupa ce am schibat limita am luat 100 pct


Titlul: Non-zero exit status
Scris de: Calin Rezeanu din Martie 26, 2012, 17:48:20
Lucrez in FreePascal si primesc eroarea Non-zero exit status. Acesta este programul:
Cod:
01.var a:array[1..500,1..500]of longint; 
02.b:array[1..250000]of byte;
03.f,g:text;
04.n:integer;
05.m,min,max,i,j:longint;
06.begin
07.assign(f,'numere.in');
08.assign(g,'numere.out');
09.reset(f);
10.rewrite(g);
11.readln(f,n);
12.m:=sqr(n);
13.for i:=1 to n do
14.        
for j:=1 to n do
15.                
if j=n then readln(f,a[i][j])
16.                        
else read(f,a[i][j]);
17.for i:=1 to m do b[i]:=0;
18.for i:=1 to n do
19.        
for j:=1 to n do
20.                
if a[i][j]>0 then b[a[i][j]]:=1;
21.min:=250000;
22.max:=0;
23.for i:=1 to m do
24.        
if b[i]<1 then
25.        
begin
26.        
if min>i then min:=i;
27.        
if max<i then max:=i;
28.        
end;
29.write(g,min,' ',max);
30.close(f);
31.close(g);
32.end.
as fi tare recunoscator daca m-ati putea ajuta. Va multumesc.

Editat de admin: Foloseste tagul "code" cand postezi surse.


Titlul: Răspuns: 484 Numere 5
Scris de: Bucur Timotei din Martie 29, 2012, 12:55:21
cica am memory limit depasit da ce are?
si cica depaseste timpu da nu inteleg numa sa citesc matricia aia si sa trec prin ea inca o data ia mai mult de 0.4 secunde?!?!?!?


Titlul: Răspuns: 484 Numere 5
Scris de: Albu Alexandru din Aprilie 02, 2012, 16:53:27
cica am memory limit depasit da ce are?
si cica depaseste timpu da nu inteleg numa sa citesc matricia aia si sa trec prin ea inca o data ia mai mult de 0.4 secunde?!?!?!?

Am vazut sursa ta si iti dau 4 indicii:

1. Nu ai neaparat nevoie de matrice.
2. De a[0] nu ai nevoie
3. Mai citeste o data problema si fii atent la un mic amanunt.
4. In cazul in care iei MLE incearca pe "char".


Titlul: Răspuns: 484 Numere 5
Scris de: Streche Robert din Aprilie 17, 2013, 06:02:39
Citat
Incearca in loc de
Cod:
bool a[500004];
asta :
Cod:
bitset<1000001>a
Si trebuie inclus headerul <bitset>; .
imi poate explica si mie cineva ce face o astfel de secventa?


Titlul: Răspuns: 484 Numere 5
Scris de: Alex Velea din Aprilie 17, 2013, 07:40:11
Citat
imi poate explica si mie cineva ce face o astfel de secventa?

Pe scurt -> e o optimizare de memorie.
Background: Desi bool-ul tine doar 1 si 0, el in memorie ocupa tot un byte, la fel ca si char-ul.

Deci, nu e "chiar" asa de avantajos bool-ul.
Defapt, nu e deloc.

Acum .. ce face acel bitset.
E o structura de date, care iti permite cu niste functii sa iti ti practic un sir de bool-uri la o memorie de 8 ori mai mica.
Bitsetul chiar tine cate un bit pentru un bool, nu 8 ca si tipul de date "bool"

Ce ar trebui sa sti despre bitset ->
Cod:
#include<bitset>
using namespace std;
bitset<100> B;

int main(){
B.set( 10, 1 ); // seteaza a 10-a valoare cu 1
B.test( 10 ); // iti returneaza valoarea bitului 10

Mai multe gasesti aici -> http://www.cplusplus.com/reference/bitset/bitset/ (http://www.cplusplus.com/reference/bitset/bitset/) -> iti recomand sa te uiti la exemple si sa citesti explicatiile pt mai multe lamuriri.

Daca vrei, poti sa iti "implementezi" un bitset si manual, dar ai nevoie de ceva cunostinte legate de operati pe biti.

Dar e mai greu, dar principiul e ca un char o sa iti tina 8 bool-uri
Pt fiecare bit, cate un bool
Practic
Cod:
A[x]
devine
Cod:
A[x/8] & ( 1<<( x%8 ) )
// Partea intreaga intra in A[] si restul iti spune bitul :D
// ca sa afli daca bitul i e setat, faci x&(1<<i)
// daca returneaza ceva != 0, atunci e setat
// defapt poate returna 0 sau 1<<i .. dar asta nu conteaza prea mult

O sa iti fie mai greu sa modifici valorile.
Daca te intereseaza, pot sa completez ..
Dar nu mi se pare mai ok bitsetul, daca te obisnuiesti cu el


Titlul: Răspuns: 484 Numere 5
Scris de: Streche Robert din Aprilie 17, 2013, 09:04:50
mersi mult pentru explicatii am folosit bitset-ul si am luat 100 pct  :yahoo:


Titlul: Răspuns: 484 Numere 5
Scris de: Johnny Depp din Aprilie 17, 2013, 11:28:44
Problema asta mi-a dat si mie batai de cap la inceput din cauza memoriei. Dar apoi am rezolvat-o mai eficient, fara matrice si fara vectori, doar cu o mica observatie matematica.


Titlul: Răspuns: 484 Numere 5
Scris de: CHIRILA ADRIAN din Ianuarie 25, 2014, 16:26:01
Am incercat sa rezolv cu memorie O(1).Imi intra doar 4 teste..pe celelalte iau incorect.Am observat ca trebuie sa fac "cast"pentru long long..ce inseamna x1LL?


Titlul: Răspuns: 484 Numere 5
Scris de: Adrian Budau din Ianuarie 25, 2014, 21:32:40
Cast la long long inseamna sa-ti transformi rezultatul din int (care merge pana la 2^31 - 1) in long long (2^63 - 1). Sunt mai multe feluri:

1) C style : b = (long long)a * c , acum a va f convertit in long long inainte sa fie inmultit cu c

2) C++ style: b = static_cast<long long>(a) * c, la fel ca mai sus

3) Trisand, un pic mai incet, s-ar putea sa te coste (foarte foarte rar) : b = 1LL * a * c, aici 1LL este defapt numarul 1 dar LL de dupa ne spune ca e long long in loc de int. 1LL * a returneaza un long long si nu un int, e chiar a doar ca e long long.


Titlul: Răspuns: 484 Numere 5
Scris de: fabbbyyy din Aprilie 30, 2015, 12:55:41
Cod:
#include <iostream>
#include <fstream>
using namespace std;
ifstream  f("numere5.in");
ofstream  g ("numere5.out");
    bool x[500001];
    int i, el, maxx, minn = 0, n, j;

int main(){
    f >> n;
    for (i = 1; i <= n; i++){
        for (j = 1; j <= n; j++){
            f >> el;
            if (el <= 500000){
                x[el]=1;
             }
        }
    }
    if(n*n < 500000){
        for (i = 1; i <= n*n; i++){
            if (x[i] == 0 && minn == 0)
                minn = i;
            else if (x[i] == 0)
                maxx = i;
        }
    }
    else {
        for (i = 1; i <= 500000; i++){
            if (x[i] == 0 && minn == 0)
                minn = i;
            else if (x[i] == 0)
                maxx = i;
        }
    }
    g << minn << " " << maxx;
    f.close();
    g.close();

return 0;
}

Nu inteleg de ce la unele imi da incorect, la altele MLE.
Am incercat si fara sa folosesc vector, doar calculand suma elementelor de pe matrice, daca stiu cate nr imi lipsesc, ca sunt consecutive etc pot sa le aflu, dar la ultimele teste dadea WA.
Eu ma dau batut, habar n-am unde gresesc.


Titlul: Răspuns: 484 Numere 5
Scris de: George Marcus din Aprilie 30, 2015, 14:23:52
Nu actualizezi bine minn si maxx. Gandeste-te ce se intampla daca lipseste un singur numar. Ca sa scapi de MLE incearca sa folosesti bitset in loc de vector de bool. Gasesti pe net cum se foloseste.


Titlul: Răspuns: 484 Numere 5
Scris de: fabbbyyy din Aprilie 30, 2015, 14:55:55
Mersi de sugestie cu bitsetul.

Daca lipseste doar un numar programul il afiseaza de 2 ori. Trebuia afisat doar o singura data? In enunt nu specifica.


Titlul: Răspuns: 484 Numere 5
Scris de: George Marcus din Mai 01, 2015, 04:17:08
Daca lipseste doar un numar programul il afiseaza de 2 ori.
Testeaza pe programul tau :)


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan Pop din Ianuarie 31, 2016, 14:42:15
Am facut problema cu bitset de marime 500001si 4 variabile de tip int.Are cineva idee ce as putea face ca sa nu mai iau MLE pe 2 teste?


Titlul: Răspuns: 484 Numere 5
Scris de: Dragos-Alin Rotaru din Ianuarie 31, 2016, 15:18:51
Încearcă să găseşti o soluţie care are O(1) complexitate (nu depinde de n) în ceea ce priveşte memoria folosită.


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan Pop din Ianuarie 31, 2016, 15:34:16
Multumesc,o sa incerc o rezolvare mai "matematica"


Titlul: Răspuns: 484 Numere 5
Scris de: Dan Pracsiu din Ianuarie 31, 2016, 17:14:37
Multumesc,o sa incerc o rezolvare mai "matematica"

Nu e vorba de asta. Probabil este din cauza ca sunt teste in care tot intervalul de la 1 la 500000 este zero. Nu ai prevazut acest caz.


Titlul: Răspuns: 484 Numere 5
Scris de: Bogdan Pop din Februarie 04, 2016, 17:04:39
Am incercat sa reevaluez acest caz,multumesc de sfat:)Totusi,problema cu memoria nu am rezolvat-o inca,o sa incerc sa gasesc o solutie