Afişează mesaje
Pagini: 1 [2]
26  infoarena - concursuri, probleme, evaluator, articole / Arhiva educationala / Răspuns: 045 Submultimi : Martie 15, 2011, 21:52:56
Hmmm... se pare ca pe aceeasi sursa, cu streamuri iau 70, cu stdio iau 100 pct.
Oricum ma bucur ca am reusit sa iau suta Very Happy
27  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 681 Numar2 : Martie 07, 2011, 19:19:36
Sooper faina problema... 100 pct din prima sursa trimisa Very Happy
Ma mir ca e foarte foarte simpla. Mi-a luat vreo 20 minute sa o rezolv + debugging.
28  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 114 Muzeu : Februarie 26, 2011, 16:29:28
Ai folosit <queue> si .pop, respectiv .push ?

Da!

Aici este sursa noua:
Cod:
#define DEBUG 0
#define MAXSTACK 1000*1000
#include<fstream>
#include<cstdlib>
#include<queue>
#if DEBUG==1
#include<iostream>
#endif

using namespace std;


class Point
{
public:
    short X, Y;

    Point() { X = Y = 0; }
    Point(short x, short y) { X = x; Y = y; }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }
    Point operator- (Point a)
    {
        return Point(X - a.X, Y - a.Y);
    }
    Point* operator= (const Point* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }

#if DEBUG==1
    friend ostream& operator<<(ostream& output, const Point &p)
    {
        output<<p.X<<","<<p.Y;
        return output;
    }
#endif
};

class PointStep : public Point
{
public:
    short Step;

    PointStep() { X = Y = 0; }
    PointStep(short x, short y) { X = x; Y = y; }
    PointStep(short x, short y, int step) { X = x; Y = y; Step = step; }
    PointStep(Point w, int step) { X = w.X; Y = w.Y; Step = step; }

    PointStep operator+ (PointStep a)
    {
        return PointStep(a.X + X, a.Y + Y);
    }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep operator- (PointStep a)
    {
        return PointStep(X - a.X, Y - a.Y);
    }

    Point operator- (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep* operator= (const PointStep* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }
};

const Point Directions[4] = {Point(0, -1), Point(1, 0), Point(0, 1), Point(-1, 0) };

int Map[260][260];
short MapSize;

queue<PointStep> Queue;

void ReadFile(char* fileName)
{
    char buffer[250];
    ifstream in (fileName);

    in>>MapSize;
    in.getline(buffer, 250, '\n');

    for (short x=0; x < MapSize; x++)
    {
        in.getline(buffer, 250, '\n');
        for (short y=0; y < MapSize; y++)
            switch (buffer[y])
            {
                case '#': Map[x][y] = -2; break;
                case 'P': Map[x][y] = 0; Queue.push(PointStep(x, y, 0)); break;
                default: Map[x][y] = -1; break;
            }
    }

    in.close();
}

void WriteFile(char* fileName)
{
    ofstream out (fileName);

    for (int x=0; x< MapSize; x++, out<<endl)
        for (int y=0; y<MapSize; y++)
            out<<Map[x][y]<<" ";
}

inline bool Okay (Point w, int pas)
{
    if (w.X < 0 || w.Y < 0 || w.X >= MapSize || w.Y >= MapSize) return false;
    if (Map[w.X][w.Y] == -1) return true;
    if (Map[w.X][w.Y] > pas) return true;

    return false;
}

void Lee()
{
    Point d;
    int pas = 0;

    while (!Queue.empty()) {
        PointStep temp = Queue.front();
        pas = temp.Step;
        for (int direction = 0; direction < 4; direction++)
        {
            d = temp + Directions[direction];

            if (Okay(d, pas))
            {
                Queue.push(PointStep(d, pas+1));
                Map[d.X][d.Y] = pas+1;
            }
        }

        Queue.pop();
    }
}


int main()
{
    ReadFile("muzeu.in");
    Lee();
    WriteFile("muzeu.out");

    return 0;
}

29  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 114 Muzeu : Februarie 26, 2011, 16:20:32
Cel mai bine ar fi sa utilizezi coada dinamica din STL.

Merci de sfat.

Am incercat si asa, dar tot 60 pct iau. Primesc TLE la testul 6, si Incorect  la 7 8 9
30  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 114 Muzeu : Februarie 26, 2011, 14:30:04
Iau doar 60 puncte si nu imi dau seama de ce...

Am implementat Lee, si culmea... cu coada de 1000*500 elemente iau 50 pct (5 incorecte);
cu coada 1000*1000 iau 60 puncte (4 incorecte)
cu coada mai lunga incep sa iau TLE.

Cu toate ca am pus o functie "Purge" care sa stearga elem folosite cand se umple.

Cod:
#define DEBUG 0
#define MAXSTACK 1000*1000
#include<fstream>
#include<cstdlib>
#if DEBUG==1
#include<iostream>
#endif

using namespace std;


class Point
{
public:
    short X, Y;

    Point() { X = Y = 0; }
    Point(short x, short y) { X = x; Y = y; }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }
    Point operator- (Point a)
    {
        return Point(X - a.X, Y - a.Y);
    }
    Point* operator= (const Point* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }

#if DEBUG==1
    friend ostream& operator<<(ostream& output, const Point &p)
    {
        output<<p.X<<","<<p.Y;
        return output;
    }
#endif
};

class PointStep : public Point
{
public:
    short Step;

    PointStep() { X = Y = 0; }
    PointStep(short x, short y) { X = x; Y = y; }
    PointStep(short x, short y, int step) { X = x; Y = y; Step = step; }
    PointStep(Point w, int step) { X = w.X; Y = w.Y; Step = step; }

    PointStep operator+ (PointStep a)
    {
        return PointStep(a.X + X, a.Y + Y);
    }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep operator- (PointStep a)
    {
        return PointStep(X - a.X, Y - a.Y);
    }

    Point operator- (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep* operator= (const PointStep* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }
};

const Point Directions[4] = {Point(0, -1), Point(1, 0), Point(0, 1), Point(-1, 0) };

int Map[260][260];
short MapSize;

PointStep Stack[MAXSTACK];
int StackSize, StackPos;


inline void Purge()
{
    for (int i = StackPos; i < StackSize; i++)
        Stack[i-StackPos] = Stack[i];

    StackPos = 0;
    StackSize -= StackPos;
}

inline void StackAdd(Point w, int step)
{
    Stack[StackSize++] = PointStep(w, step);

    if (StackSize >= MAXSTACK-2) Purge();
}

//**** Implementations of ReadFile / WriteFile
// ...
// ****

inline bool Okay (Point w, int pas)
{
    if (w.X < 0 || w.Y < 0 || w.X >= MapSize || w.Y >= MapSize) return false;
    if (Map[w.X][w.Y] == -1) return true;
    if (Map[w.X][w.Y] > pas) return true;

    return false;
}

void Lee()
{
    Point d;
    int pas = 0;

    while (StackPos < StackSize) {
        pas = Stack[StackPos].Step;
        for (int direction = 0; direction < 4; direction++)
        {
            d = Stack[StackPos] + Directions[direction];

            if (Okay(d, pas))
            {
                StackAdd(d, pas+1);
                Map[d.X][d.Y] = pas+1;
            }
        }

        StackPos++;
    }
}


int main()
{
    ReadFile("muzeu.in");
    Lee();
    WriteFile("muzeu.out");

    return 0;
}

31  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 683 Piata : Martie 05, 2010, 19:24:24
Nu am sugerat sa numeri de cate ori apare, ci sa calculezi de cate ori apare.
Un numar va aparea pe diagonala sau paralel cu diagonala, si tu stii unde intra si unde iese din dreptunghiul ala, deci se poate calcula cate pozitii ocupa in dreptunghi.

Am incercat asa, dar chiar si pentru exemplu mergea muuult mai greu...
EDIT: Cred ca e din cauza Visual Studio... si originalul vad ca merge tot la fel de greu...
32  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 683 Piata : Martie 05, 2010, 09:07:02
Iau 90 puncte pe solutia asta...
Cod:
#include<fstream>
using namespace std;

int *arr;
int n;

int f(int nr)
{
int sum;

for (sum = 0; nr > 0; nr /= 10)
sum+=nr%10;
return sum;
}

void set()
{
for (int i = 0; i < n; i++)
arr[i] = f(i+1);
}

int main()
{
int mi, mj, ti, tj; int p;
long sum = 0;

ifstream in ("piata.in");
in>>n;
in>>ti>>tj;
in>>mi>>mj;
in.close();

arr = new int[n+1];
set();

for (int i = ti; i <= mi; i++)
for (int j = tj; j <= mj; j++) {
p = j - i; while (p<0) p+=n;
sum += (long) arr[p];
}

ofstream out ("piata.out");
out<<sum;
out.close();

delete[] arr;
return 0;
}

Imi iese din timp la testul 7... are cineva vreo idee de optimizare? Think

Incearca sa te folosesti de faptul ca liniile sunt permutari circulare ale numerelor f(x). Asta inseamna ca la suma aia tu aduni acelasi f(x) de mai multe ori si pierzi ceva timp.

Se poate calcula pentru fiecare numar de cate ori il ai in dreptunghiul ala, si asa il aduni doar o data inmultit cu ceva.
Si sugerezi ca numarand de cate ori apare un nr este mai eficient decat sa il adun de atatea ori?
33  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 187 Ecuatii : Martie 04, 2010, 08:06:41
Da ai dreptate...  Embarassed  Rolling on the Floor Laughing  era ecuatii2, nu m-am mai uitat la cerinta  Smile ms mult
34  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 187 Ecuatii : Martie 03, 2010, 22:49:19
Mi-a iesit problema, in Visual Studio 2008 merge perfect, dar aici obtin eroare de compilare...
Cod:
Eroare de compilare: In file included from /usr/include/c++/4.2/string:53, from /usr/include/c++/4.2/bits/locale_classes.h:47, 
from /usr/include/c++/4.2/bits/ios_base.h:47,
 from /usr/include/c++/4.2/ios:48,
 from /usr/include/c++/4.2/istream:44,
from /usr/include/c++/4.2/fstream:45,
from user.cpp:3:

/usr/include/c++/4.2/bits/stl_function.h:134: error: expected identifier before numeric constant
/usr/include/c++/4.2/bits/stl_function.h:134: error: expected unqualified-id before numeric constant
/usr/include/c++/4.2/bits/stl_function.h:143: error: expected identifier before numeric constant
/usr/include/c++/4.2/bits/stl_function.h:143: error: expected unqualified-id before numeric constant

Aici e sursa...
Cod:
#define plus 1
#define minus 0
#include<fstream>
#include<cstdlib>
#include<cstring>
using namespace std;


int number[2], nx[2];

void check(char str[])
{
int i = 0, len = strlen(str);
int i2;
char arr[5]; bool sign;
int side = 0;
int temp;

while (i<len) {
// check sign
if (str[i] == '-') {
sign = minus; i++;
}
else if (str[i] == '+') {
sign = plus; i++;
}

// get number
i2 = 0;
while (str[i] >= '0' && str[i] <= '9') {
arr[i2] = str[i];
i2++; i++;
}
temp = atoi(arr);
if (sign == minus) temp*=-1;
memset(arr, 0, 5);

// check if x and make calculations
if (str[i] == 'x') {
nx[side]+=temp;
i++;
}
else number[side]+=temp;

if (str[i] == '=') {
i++; side++;
}
}
}



int main()
{
int n; long long result;
char str[256];

ifstream in ("ecuatii.in");
ofstream out ("ecuatii.out");
in>>n;

in.getline(str, 256, '\n');

for (int i = 0; i < n; i++) {
memset(str, 0, 256);
number[0] = 0; number[1] = 0;
nx[0] = 0; nx[1] = 0;
in.getline(str, 256, '\n');
check(str);

if ((nx[0] == nx[1]) && (number[0] == number[1]))
out<<"infinit\n";

else if ((nx[0] == nx[1]) && (number[0] != number[1]))
out<<"imposibil\n";

else {
number[0] = number[0] - number[1];
nx[0] = nx[0] - nx[1];
result = (long long)(10000*number[0])/nx[0]*-1;

out<<result/10000<<"."<<abs(result%10000)<<endl;
}
}
out.close();
in.close();
return 0;


}

Are cineva vreo idee de ce apare eroarea? E ciudat ptr ca in Visual Studio a mers...
35  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 482 Pluton : Februarie 13, 2010, 12:43:05
Inseamna ca ai numarat plutoanele gresit ... verifica sa vezi de ce iti da gresit, e cam greu sa verificam noi sursa ta  Think

Oare? Am pus sa afiseze in fisierul de debugging placuta fiecarui soldat, "sablonul" lui, si numarul plutonului in care se afla, si n-am gasit nici o greseala (unde am cautat, fisierul are 8000 randuri).
BTW asta e testul 9 de la oji.

De exemplu:
Cod:
2543: sablon 9865543221; placa 1234569582; verify to 9865543221; 423 <- numarul plutonului
2544: sablon 9865543221; placa 1234569825; verify to 9865543221; 423
2545: sablon 9865543221; placa 1234569852; verify to 9865543221; 423
2546: sablon 9865543321; placa 1234568359; verify to 9865543221; 424
2547: sablon 9865543321; placa 1234568395; verify to 9865543321; 424
2548: sablon 9865543321; placa 1234568539; verify to 9865543321; 424
                                                      ^ aici e sablonul de la placa cu care compara, sa verific daca o face bine


Si am cautat mult o greseala in fisierul asta, dar n-am gasit.
36  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 482 Pluton : Februarie 11, 2010, 11:24:14
Aici e sursa mea, nu pot sa imi dau seama ce e gresit, la testul 9 imi da numarul de plutoane gresit... Algoritmul e simplu, aranjeaza descrescator cifrele numarului, formand un 'sablon' pentru plutonul lui, si lucreaza in long long, apoi sorteaza toate placutele in functie de sablon, si numara.

Doar la testul 9 e gresit, si am verificat fisierul de debugging, out.txt, si nici eu n-am gasit nici o eroare, asta e ciudat.
Cod:
#include<fstream>
#include<cstdlib>
#include<cstring>
using namespace std;

int n;
ofstream debug ("out.txt");

int compare_nr (const void* a, const void* b)
{
      return *(int*)b - *(int *)a;
}


class soldat {
   public:
      long placa;
      unsigned long long sablon;

      void set(int nr);

} *s;

void soldat::set(int nr) {
        int *a; a = new int[12];
        memset(a, 0, sizeof(int)*12);
        int len;

        placa = nr;

        for (len = 0; nr > 0; len++) {
             a[len] = nr%10;
             nr/=10;
        }

        for (int i = 0; i < 12; i++)
            debug<<a[i]<<" ";

        debug<<" <> ";

        qsort(a, len, sizeof(int), compare_nr);

        for (int i = 0; i < 12; i++)
            debug<<a[i]<<" ";
        debug<<" wazaaa "<<len<<"  bannnnng ";

        sablon = 0;
        for (int i = 0; i < len; i++) {
             sablon *= 10; sablon += a[i];
        }
        debug<<sablon<<endl;

        delete[] a;
}


int compare_sold (const void *a, const void *b)
{
    soldat c = *(soldat*)a;
    soldat d = *(soldat*)b;

    if (c.sablon == d.sablon) return c.placa - d.placa;
    else return c.sablon - d.sablon;
}

int main()
{
      long temp;
      unsigned long long sabl;

      ifstream in ("pluton.in");
      in>>n;
      s = new soldat[n];

      for (int i = 0; i < n; i++)
      {
            in>>temp;
            s[i].set(temp);
      }
      in.close();
      qsort (s, n, sizeof(soldat), compare_sold);

      ofstream out ("pluton.out");

      sabl = s[0].sablon;
      temp = 0;
      long count = 1, max = 0, begin, same = 0;
      for (int i = 0; i <= n; i++)
      {
            debug<<i<<": sablon "<<s[i].sablon<<"; placa "<<s[i].placa<<"; verify to "<<sabl<<"; ";
            if (s[i].sablon == sabl && i<n) {
                temp++;
            }
            else {
                sabl = s[i].sablon;
                if (temp > max) {
                    max = temp;
                    begin = i-max;
                    same = 0;
                }
                if (temp == max) same++;

                temp = 1;
                count++;
            }
            debug<<count<<endl;
      }

      out<<count-1<<"\n";
      out<<max<<"\n";
      out<<same<<"\n";
      for (int i = 0; i < max; i++)
        out<<s[begin+i].placa<<" ";
      out.close();

      delete[] s;
      return 0;
}
37  Comunitate - feedback, proiecte si distractie / Feedback infoarena / Răspuns: Erori ciudate de compilare : Noiembrie 22, 2009, 17:05:22
Infoarena foloseste compilatorul GCC versiunea 4.2 pe care iti da respectiva eroare. "count" e deja definit in <algorithm> si nu stie sa-si dea seama la care dintre ele te referi aparent. Inlocuieste count cu altceva si ar trebui sa mearga.
Merci, asta era problema deci...   Brick wall Thumb up
38  Comunitate - feedback, proiecte si distractie / Feedback infoarena / Erori ciudate de compilare : Noiembrie 22, 2009, 16:46:51
Am trimis problema verificata si compilata cu gcc pe linux si a mers perfect. Pe compilatorul asta am primit:

Cod:
Eroare de compilare: user.cpp: In function 'void vote(point)':
user.cpp:50: error: reference to 'count' is ambiguous
user.cpp:34: error: candidates are: int count
/usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&)
user.cpp:50: error: reference to 'count' is ambiguous
user.cpp:34: error: candidates are: int count
/usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&)
user.cpp:51: error: reference to 'count' is ambiguous
user.cpp:34: error: candidates are: int count
/usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&)
user.cpp:51: error: expected primary-expression before '*' token
user.cpp:51: error: expected primary-expression before ')' token
user.cpp:51: error: expected `;' before 'bsearch'
user.cpp:54: error: reference to 'count' is ambiguous
user.cpp:34: error: candidates are: int count
/usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&)
user.cpp:54: error: reference to 'count' is ambiguous
user.cpp:34: error: candidates are: int count
/usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:54: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:54: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp: In function 'int sondaj(point)': user.cpp:65: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:65: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:66: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:66: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:67: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:67: error: expected primary-expression before '*' token user.cpp:67: error: expected primary-expression before ')' token user.cpp:67: error: expected `;' before 'bsearch' user.cpp:73: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) user.cpp:73: error: reference to 'count' is ambiguous user.cpp:34: error: candidates are: int count /usr/include/c++/4.2/bits/stl_algo.h:424: error: template<class _InputIterator, class _Tp> typename std::iterator_traits::difference_type std::count(_InputIterator, _InputIterator, const _Tp&)
(nu mai am timp sa dau enter la toate liniile)
Ce am gresit?

Sursa:
Cod:
#define _input "votare.in"
#define _output "votare.out"

#include <fstream>
#include <stdlib.h>

using namespace std;

class point
{
    public:
     int x, y;
     bool la_vot;

     int operator % (point a)
     {
         int dist;
         dist = (x-a.x)*(x-a.x)+(y-a.y)*(y-a.y);
         return dist;
     };

     bool operator == (point a)
     {
         if (x == a.x && y == a.y) return true;
         return false;
     };
     point() { x = 0; y = 0;};
     point(int a, int b) { x = a; y = b;};
     point(int a, int b, bool c) {x = a; y = b; la_vot = c;};

};

point vot[100000];
int count;


int cmp_pos (const void *a, const void *b)
{
    point c, d;
    c = *(point *)a;
    d = *(point *)b;
    if (c.x == d.x) return c.y - d.y;
    else return c.x - d.x;
}


void vote(point pos)
{
    point *a;
    qsort((void *)vot, count, sizeof(point), cmp_pos);
    a = (point *)bsearch(&pos, (void *)vot, count, sizeof(point), cmp_pos);

    if (a == NULL ) {
        vot[count] = pos; count++;
        }

}


int sondaj (point pos)
{
    int min = 99999, value;
    point *a;

    if (count <= 1) return -1;
    qsort((void *)vot, count, sizeof(point), cmp_pos);
    a = (point *) bsearch(&pos, (void *)vot, count, sizeof(point), cmp_pos);

    if (a != NULL) {
        if (a->la_vot) return -1;
    }

    for (int i = 0; i < count; i++)
    {
        value = pos % vot[i];
        if (value < min) min = value;

    }

    return min;
}


int main()
{
    int n; int action;
    point pos;

    ifstream PNL (_input); PNL>>n;
    ofstream PSD (_output);

    for (int PCR = 0; PCR < n; PCR++)
    {
        PNL>>action>>pos.x>>pos.y;

        if (action == 0) {
            pos.la_vot = false; vote (pos); }
        else if (action == 1) {
            pos.la_vot = true; vote (pos); }

        else if (action == 2) PSD<<sondaj (pos)<<'\n';
    }

    PNL.close();
    PSD.close();
    return 0;
}
39  infoarena - concursuri, probleme, evaluator, articole / Arhiva educationala / Răspuns: 011 Generare de permutari : Aprilie 17, 2009, 09:03:20
Am facut problema cu next_permutation din STL. Cu streamuri (pe calcul meu) compilatorul MinGW spunea ca executia a durat 0.5 secunde, cu stdio doar 0.2 secunde.
40  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 839 Palindrom2 : Aprilie 08, 2009, 14:12:57
Daca am la intrare un sir:
aba
care este deja palindrom, atunci raspunsul corect este aba sau ababa ?
41  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 190 Telegraf : Aprilie 07, 2009, 19:45:05
Am incercat sa rezolv problema astfel:

Citesc din fisier, numar cate tipuri caractere are textul, in functie de acest numar aflu pe cati biti trebuie scris in reprezentare binara, si am numarat in binar de la 0 la nr respectiv pe cati biti trebuie. La ultimul numar din acest sir de nr binare ii tai ultimele zerouri. Daca numarul e mai > 32 (si <36) atunci in binar va fi de forma 1000xx, asadar tai cele 3 zerouri.

Apoi aranjez sirul citit din fisier astfel incat toate valorile >0 sa fie la inceputul sirului, si zerourile la sfarsit.
Am numarat apoi cati de 0 si cati de 1 exista la fiecare caracter in reprezentarea binara. Dintre nr de 0 si nr de 1 il aleg pe cel mai mare ca fiind punct, iar pe cel mai mic fiind linie, adun nr puncte si 2x nr linii si asta e rezultatul.

Prin algoritmul asta iau 10/100, iau doar primul test, restul WA. Imi poate zice cineva daca e bun sau nu algoritmul, ce ar trebui sa schimb sau poate alt algoritm care functioneaza?
42  infoarena - concursuri, probleme, evaluator, articole / Arhiva educationala / Răspuns: 028 Sortare prin comparare : Aprilie 05, 2009, 13:14:23
Am luat 100 puncte cu CombSort
43  Comunitate - feedback, proiecte si distractie / Off topic / Răspuns: Despre oji.... : Aprilie 02, 2009, 16:35:50
Eu cred ca e o idee foarte buna sa scapam de mosneagu' asta de Borland C 3.1, deseori patesc sa imi iese din borland si eventual sa pierd sursa din cauza bugurilor.

Atat timp cat am folosit linux (ubuntu) pentru cateva luni am folosit gcc si ca IDE am folosit Code::Blocks. De atunci si pe windows tot Code::Blocks folosesc cu compilatorul mingw, si cel mai tare: mingw afiseaza si durata exacta a executiei cu o precizie cam de 0.01 secunde, foarte folositor la olimpiade si concursuri unde timpul conteaza.

Imi place mult Code::Blocks ptr. ca suporta o gramada de compilatoare (mingw, gcc, intel c/cpp compiler, microsoft visual c++ 2005/2008 si char si Borland C 5.5). De asemenea este compatibil cu Windows, Linux si Mac OS.
44  Comunitate - feedback, proiecte si distractie / Feedback infoarena / Răspuns: Bug reports : Aprilie 02, 2009, 15:26:43
Am observat ca linkul 'copiaza in clipboard' nu are nici un efect. Folosesc FireFox 3.
45  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 046 Text : Martie 31, 2009, 11:18:22
pt o sursa de genul:
#include <fstream.h>
#include <string.h>
ifstream fin("text.in");
ofstream fout("text.out");
unsigned long nrc,nrl,medie;
int ok;
char c;
int main()
{ fout<<3;
   return 0;
}
primesc eroarea de compilare:
/usr/lib/gcc-lib/i486-linux/3.3.5/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:98: undefined reference to `main'
collect2: ld returned 1 exit status
 Think

Trebuie sa pui #include<fstream> in loc de #include<fstream.h> si dupa #include pui 'using namespace std;'.
GCC nu e la fel ca Borland C.
46  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 404 Lacuri : Martie 30, 2009, 09:44:04
Am facut programul cu Lee pe coada, dar numai ca pica testele 6 si 7. Am facut un program in vechiul Turbo C 3.0 care sa imi afiseze exact cum arata fisierul de intrare (testele sunt de la ONI) grafic si arata asa (cu albastru lacuri, cu verde uscat):

Editat de moderator: Testele oficiale nu se posteaza pe forum sub nici o forma.
47  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 483 Maxd : Martie 11, 2009, 11:53:12
Sunt intr-a 9-a si n-am auzit de 'ciur'(??).

Dar am facut cum am stiut:
Mi-a dat la 3 teste timp depasit, iar la restul a mers, cum pot sa optimizez?
Cod:
#include <fstream>
#include <math.h>

using namespace std;

int calcdiv(int nr)
{
    int a=0,s;
    s=sqrt(nr);
    for (int i=1;i<=s;i++)
        if (nr%i==0) a+=2;
    return a;
}

int main()
{
    int max=0, maxi, a, b, no, c;
    ifstream in ("maxd.in");
    in>>a>>b;
    in.close();

    no=1;
    for (int i=a;i<=b;i++)
    {   c=calcdiv(i);
        if (c>max) { max=c; no=1; maxi=i; }
        else if (c==max) no++;
    }

    ofstream out("maxd.out");
    out<<maxi<<" "<<max<<" "<<no;
    out.close();
}
48  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 484 Numere 5 : Martie 08, 2009, 14:35:53
Salutare
Am rezolvat problema, dar am luat doar 50 puncte pentru ca pentru 2 teste raspunsul e incorect  Brick wall Brick wall Brick wall. 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..
49  infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 006 Factorial : Ianuarie 08, 2009, 22:21:40
Salutare
Imi merge programul, dar nu si atunci cand nu gaseste nici un numar care sa indeplineasca conditiile: timp depasit. De asemenea compilatorul imi zice ca raspunsul e gresit dintr-un motiv necunoscut. Unde am gresit? Think
Cod:
#include<iostream.h>
#include<fstream.h>

ifstream in("fact.in");
ofstream out("fact.out");

int main()
{
int p,ok=0,n,twos=0,fives=0,pp;
in>>p;

for(n=1;ok==0 && n>0;n++)
{
pp=n;
while(pp%5==0 || pp%2==0){
if (pp%2==0) { twos++; pp=pp/2;}
if (pp%5==0) { fives++; pp=pp/5;}
}

if(twos>=p && fives>=p) ok=n;
}

if(ok==0) out<<-1;
else out<<ok;

out.close();
in.close();

return 0;
}
Pagini: 1 [2]
Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines