Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zadanie z VI OIG

Ostatnio zmodyfikowano 2012-07-10 17:25
Autor Wiadomość
xevuel
» 2012-07-10 07:41:36
Nie, żeby dostać 100 punktów nie trzeba mieć ani trochę szczęścia.
Owszem, 100 pkt może i nie, ale dostać np. 63 zamiast 56, to już trochę tego szczęścia jest.

Twój algorytm to zwykły brute, jest to rozwiązanie złożonościowo za wolne i nie może dostać 100 punktów bez względu na to czy używasz printfów czy czegokolwiek innego, jest po prostu błędne.
Oj wiem :) Ale spróbuj na pierwszym w życiu takim konkursie myśleć o tym, aby się wykonał szybko. Wtedy chcesz tylko, żeby działał. Tym bardziej, że w szkole nie uczą rozwiązywać takich algorytmów.

i bardzo dobrze, czas w jakim wykonuje się Twój program zależy od złożoności, jeśli napiszesz poprawny algorytm to czasy będą się mieściły w dolnej granicy limitu
A ja uważam, że jeśli program wyrobił się w czasie, no to przynajmniej 1 pkt powinien dostać.

system jest bardzo dobry, uwala wszystkie rozwiązania heurystyczne, punktacja względem złożoności tak czy siak była dopasowana tak że jeśli miałeś bruta kwadratowego to testy były ułożone tak abyś dostał 30 pkt, jeśli napisałeś poprawne rozwiązanie to dostawałeś 100
B. dobry? Jeden z moich kolegów miał tak, że na przykładowo 4 kategorie po 5 testów, on miał w każdej kategorii 4 testy prawidłowe, a jeden miał limit czasu. Dostał 0 pkt. To Twoim zdaniem jest sprawiedliwe?

te dane są niepotrzebne, mówisz o finale? jeśli tak to dostałeś kartkę z omówieniem wszystkich zadań, sam je rozdawałem :D ocena swojego programu pod względem złożonościowym jest bardzo ważna
Tak, mówię o finale. Moim zdaniem jednak są potrzebne, przecież teraz już i tak wyników nie zmienię, a chciałbym wiedzieć, na jakich przykładach program się wywalał :) Kartki... sam sobie wziąłem, leżały na stoliku ;p

Powiedz mi jeszcze ison, czy to normalne, że na środowisku udostępnionym na finale OIG (w moim przypadku Win7) program działał prawidłowo (mówię o tych przykładach, które są podawane przy każdym zadaniu), a po wysłaniu rozwiązania do systemu otrzymywałem "Błąd uruchomienia"? Bo wg mnie to raczej normalne i dobre nie jest.

I najważniejsze - nie krytykuję założeń, które chcą, aby program wykonywał się jak najszybciej. Krytykuję system, który jak widzisz w zależności od obciążenia (czy może komputera, nie wiem) może zrobić różnicę 7 pkt, a przypuszczam, że i więcej. Krytykuję system, który kompiluje tylko na Linuksie, a jako środowisko udostępnia też Win7. Krytykuję system, który nie mówi, czy mam 0 czy 100 pkt wcześniej niż po zakończeniu konkursu...
P-59768
ison
» 2012-07-10 14:23:02
weż tylko pod uwagę, że każdy był jednakowo oceniany, ten sam identyczny program raczej nie przechodził raz na 60 pkt a raz na 70, różnice były niewielkie o ile jakieś były,

Oj wiem :) Ale spróbuj na pierwszym w życiu takim konkursie myśleć o tym, aby się wykonał szybko. Wtedy chcesz tylko, żeby działał. Tym bardziej, że w szkole nie uczą rozwiązywać takich algorytmów.
początkowo myślałem że to był post autora tematu dlatego tak napisałem :)

A ja uważam, że jeśli program wyrobił się w czasie, no to przynajmniej 1 pkt powinien dostać.
no trochę dostawał przecież

co do grupowania testów to niestety takie rzeczy się zdarzają, ale jak już mówiłem, każdy był oceniany po równo

Kartki... sam sobie wziąłem, leżały na stoliku ;p
na krzesłach były :D na stolikach też cośtam zostało

Powiedz mi jeszcze ison, czy to normalne, że na środowisku udostępnionym na finale OIG (w moim przypadku Win7) program działał prawidłowo (mówię o tych przykładach, które są podawane przy każdym zadaniu), a po wysłaniu rozwiązania do systemu otrzymywałem "Błąd uruchomienia"? Bo wg mnie to raczej normalne i dobre nie jest.
ciekawa sprawa, masz kod? może nie wczytywałeś do eofa jak trzeba było albo coś w tym stylu, takie rzeczy łatwo przegapić

Krytykuję system, który jak widzisz w zależności od obciążenia (czy może komputera, nie wiem) może zrobić różnicę 7 pkt, a przypuszczam, że i więcej.
testów nie układa się bezmyślnie losowo, przykładowo oczekiwana złożoność w danym zadaniu liniowa
pierwsze kilka testów masz na poprawność algorytmu, np n < 1000, wtedy nawet jak masz kwadratowego bruta to i tak je przejdzie,
potem w kilku kolejnych testach n drastycznie wzrasta, np n = 10000000, wtedy nie ważne ile masz szczęścia zawsze kwadratowy algorytm dostanie 0 a liniowy max, tych 'przedziałów' może być więcej, czasem ciężko wykryć różnicę między n a n log n dlatego niekiedy zdarza się, że wyżyłowany brute też cośtam dostanie z wyższych testów, tyle, że to raczej nie jest kwestia szczęścia tylko właśnie tego żyłowania
P-59785
xevuel
» 2012-07-10 14:44:34
ten sam identyczny program raczej nie przechodził raz na 60 pkt a raz na 70
Owszem, raczej ciężko by było o coś takiego w czasie finału :) Ale program skompilowany w grudniu na konkursie vs program skompilowany wczoraj - różnica 7 pkt.

no trochę dostawał przecież
Owszem, trochę dostawał. Ale za wykonanie w czasie 0.99 s w limicie 1s nie dostawał nic.

każdy był oceniany po równo
Wiem, ale to jest trochę tak jak z murawą - jeśli murawa to błoto, to owszem, wszyscy piłkarze mają takie same warunki, ale poziom raczej wtedy nie wzrasta...

ciekawa sprawa, masz kod? może nie wczytywałeś do eofa jak trzeba było albo coś w tym stylu, takie rzeczy łatwo przegapić
Mam, zaraz z archiwum OIG'u ściągnę. Tylko od razu mówię, że owszem, miał błąd, na XP'ku też się wywalał. Pretensje mam o to, że jeśli program działa mi prawidłowo na systemie Win7, to skąd ja mam wiedzieć, że na Ubuntu czy na XP'ku sie wywali? Albo, albo. Albo wywalają możliwość korzystania z Windowsa w czasie OIG, albo kompilują też na Windzie.

//edit: Nie wiem czy Ci się do czegoś przyda, no ale masz:
C/C++
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>

using namespace std;

int main( int argc, char * argv[] )
{
    int N = 0;
    cin >> N;
    vector < string > array;
    for( int i = 0; i < N; i++ )
    {
        string first = "";
        array.push_back( "" );
        cin >> array[ i ];
    }
   
    vector < string > arr;
   
    int size = array[ 0 ].size();
   
    for( int i = 0; i < size; i++ )
    {
        string litera;
        litera = array[ 0 ][ 0 ];
        array[ 0 ].replace( 0, 1, "" );
        bool b = true;
        for( int j = 1; j < array.size(); j++ )
        {
            int pos = 0, pos2 = - 1;
            pos = array[ j ].find( litera, pos2 + 1 );
            if( pos == string::npos ) { b = false; break; }
        }
        if( b == true )
        {
            for( int j = 1; j < array.size(); j++ )
            {
                int pos = 0, pos2 = - 1;
                pos = array[ j ].find( litera, pos2 + 1 );
                array[ j ].replace( pos, 1, "" );
            }
            arr.push_back( litera );
        }
    }
   
    petla:
   
    for( int i = 0; i < arr.size(); i++ )
    {
        if( arr[ i ] < arr[ i + 1 ] )
        {
            vector < string > arr2;
            for( int j = 0; j < arr.size(); j++ )
            if( j != i )
                 arr2.push_back( arr[ j ] );
           
            arr = arr2;
            goto petla;
        }
    }
   
    string word;
   
    for( int i = 0; i < arr.size(); i++ )
    {
        word += arr[ i ];
    }
   
   
    if( word < "bitek" )
         printf( "bitek" );
    else printf( word.c_str() );
   
    return 0;
}
Cały kod pisałem na szybko. Albo inny przykład:
C/C++
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <time.h>

using namespace std;

int main( int argc, char * argv[] )
{
    int W = 0, S = 0;
    cin >> W >> S;
    vector < string > array;
    for( int i = 0; i < W; i++ )
    {
        array.push_back( "" );
        char buf[ 512 ];
        cin.getline( buf, 512 );
        array[ i ] = buf;
    }
   
    cin.ignore( 1024, '\n' );
   
    int P = 0;
    cin >> P;
    for( int i = 0; i < P; i++ )
    {
        int R = 0, C = 0;
        cin >> R >> C;
       
        vector < string > arr;
        for( int i = 0; i < R; i++ )
        {
            arr.push_back( "" );
            char buf[ 512 ];
            cin.getline( buf, 512 );
            array[ i ] = buf;
        }
    }
    cin.ignore( 1024, '\n' );
    srand( time( 0 ) );
   
    if( rand() % 2 == 0 ) cout << "TAK";
    else cout << "NIE";
   
    return 0;
}
Nie miałem kompletnie pomysłu jak to rozwiązać, to se myślę - "walnę z randa, a jak wpadnę na pomysł, to wyślę lepszą wersję. Może przynajmniej kilka pkt dostanę". Na Win7 ofkors wszystko działało, na Ubu - "Błąd uruchomienia"... Co to w ogóle znaczy błąd uruchomienia? Program nie oczekiwał na jakieś argumenty? nie wiem...

@abdi:
nie wiem czy pokazywac kod czy sami wolicie to zrobic.
Wstaw, chętnie zobaczę jak to powinno wyglądać :) Na chwilę obecną nie mam czasu się nad tym zadaniem zastanawiać niestety...
P-59786
ison
» 2012-07-10 16:36:51
C/C++
for( int i = 0; i < arr.size(); i++ )
{
    if( arr[ i ] < arr[ i + 1 ] )
    {
takie coś to UB (http://en.wikipedia.org/wiki/Undefined_behavior), nie da się przewidzieć co się stanie
P-59795
xevuel
» 2012-07-10 16:40:06
Dlaczego? Jedyną opcją jest wyjście poza tablicę przy ostatniej iteracji i, o tym mówisz? Jeśli tak, to faktycznie tutaj błąd z mojej strony, aczkolwiek to nie uniewinnia w pełni tego systemu, bo inne kody na wcześniejszych etapach też działały inaczej na XP niż u nich.

//Powiedz mi jeszcze, co to znaczy "Błąd uruchomienia" :)
P-59796
ison
» 2012-07-10 16:45:18
Dlaczego? Jedyną opcją jest wyjście poza tablicę przy ostatniej iteracji i, o tym mówisz?
tak

inne kody na wcześniejszych etapach też działały inaczej na XP niż u nich.
język ten sam, standard ten sam, jak chcesz wiedzieć co jest zdefiniowane a co nie to sobie poczytaj standard języka ;)

Z tego co pamiętam to błąd uruchomienia mogłeś dostać na wiele sposobów. Albo wykorzystywałeś niedozwolone funkcje typu operacje na plikach, albo złą ilość danych wczytywałeś, albo nic nie wypisywałeś. Nie jestem od końca pewien, możliwe, że to było spowodowane przez to UB.
P-59797
xevuel
» 2012-07-10 16:49:02
wykorzystywałeś niedozwolone funkcje typu operacje na plikach
Na pewno nie - chyba że rand jest zabronione :)

albo złą ilość danych wczytywałeś
Też nie, przynajmniej pod Win7 czekał do końca.

nic nie wypisywałeś
Nie ma takiej opcji, musiał coś wypisać.

możliwe, że to było spowodowane przez to UB
Tego chyba w drugim kodzie nie ma?

język ten sam, standard ten sam, jak chcesz wiedzieć co jest zdefiniowane a co nie to sobie poczytaj standard języka ;)
Oj no przecież wiem, że wyjście poza tablicę jest niezdefiniowane ;) Tak to jest, jak się nie ma pod ręką debuggera...
P-59798
ison
» 2012-07-10 17:00:10
drugi kod dostaje błąd wykonania? sprawdź czy na pewno wczytujesz tyle danych ile jest powiedziane w zadaniu, jeśli tak to nie wiem czemu

apropo debuggera to gdb chyba był? ;)
P-59799
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona