Najnowsze posty na Forum
Z kategorii:
strona 1 z 212następna »

Chodzi tu o tą pętle. Jest problem z alokacją (tak to się chyba nazywa)

Re: Co tu nie gra? EQ przez smaneksmanek, 15 Oct 2009 19:50
Co tu nie gra? EQ
smaneksmanek 13 Oct 2009 21:52
w dyskusji Zadania / SPOJ » Co tu nie gra? EQ

sorry że to jeszcze raz ja ale nie mogę sobie z tym poradzić. Problem jest taki że przy wczytaniu jako n 1 wyskakuje błąd oraz że wyniki poszczególnych n (oprócz 1) jakoś się dziwnie sumują czy jakoś tak.

#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
int main()
{

double c,d,t1,wynik=0;
int *n,T;
cin»T;
n=new int[T];

for(int t1=0;t1<=T-1;t1++)
{

cin»n[t1];

for(d=0;d*d*d*d<=n[t1];d++)

{

for(c=0;c*c*c<=n[t1];c++)
{

wynik+=floor(sqrt(n[t1]-d*d*d*d-c*c*c))+1;

}

}

cout«wynik«endl;
}

delete n;
getch();
return(0);

}

Co tu nie gra? EQ przez smaneksmanek, 13 Oct 2009 21:52

1. Nie uzywaj nigdy (o ile nie jestes pewien, ze wiesz po co) typu float. Uzywaj double.
2. cout«setprecision(2)«fixed«D«endl;

Re: Co tu nie gra? "Bridge" przez tu_rutu_ru, 11 Oct 2009 11:48

dzięki poszło teraz, tylko zdaje mi się że coś z tym zaokrąglaniem nie tak wyszło. jak to inaczej zrobić??

Re: Co tu nie gra? "Bridge" przez smaneksmanek, 11 Oct 2009 11:34

cout«"Wej\230cie:"«endl;
cout«"Wyj\230cie:"«endl;

Po co to ??!! W takich konkursach gdzie rozwiazania sprawdza komputer, trzeba wypisywac tylko to co nam karza w specyfikacji wyjscia. Polecam zapoznanie sie z http://hs.spoj.pl/embed/guide

Re: Co tu nie gra? "Bridge" przez tu_rutu_ru, 11 Oct 2009 10:39

Dzień dobry
Czy wiecie czemu odrzuca mi to system?

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
int main()
{
float a[4]; //a- a[0], b - a[1], c - a[2], h-a[3],
float x1;
float x2;
float d1;
float d2;
float D;

cout«"Wej\230cie:"«endl;
cin»a[0]»a[1]»a[2]»a[3];
cout«"Wyj\230cie:"«endl;
x1=(a[2]*a[0])/(a[0]+a[1]);
x2=a[2]-x1;
d1=sqrt((a[0]*a[0])+(x1*x1));
d2=sqrt((a[1]*a[1])+(x2*x2));
D=d1+d2+a[3];

if(10<D<100)
{
cout«setprecision(2+3)«D;
}
else
{
cout«setprecision(3+3)«D;
}

return(0);

}

u mnie na kompie wszystko gra…

Co tu nie gra? "Bridge" przez smaneksmanek, 11 Oct 2009 10:26

Link do wykladow, jak i do innych przydatnych stron znajdziecie w zakładce Przydatne->linki. Polecam zapoznanie się ze stronami tam wymienionymi, a także zapoznanie się z całą zawartoscia strony, ktora moze sie okazac bardzo pomocna …

W tym wątku prowadzimy dyskusje o zadaniach z Ligi

High School Programming League 09/10 przez tu_rutu_ru, 09 Oct 2009 17:07
  • Grafy
    • BFS
    • DFS (klasyfikacja krawędzi!)
    • SCC (silnie spójne składowe)
    • Sortowanie topologiczne
    • Mosty w grafie
    • Punkty artykulacji
    • Dijkstra
    • Bellman-Ford
    • Kruskal
    • Prim
    • Floyd-Warshall
    • Johnson (najkrótsze ścieżki w czasie O( V^2 * lg V + V * E )
    • Max skojarzenie w grafie dwudzielnym (w czasie O(V * E))
    • Hopcroft–Karp (max skojarzenie w grafie dwudzielnym w czasie O(sqrt(V) * E))
    • Edmonds (skojarzenia w grafach dowolnych)
    • Cykl Eulera
    • Cykl Hamiltona
    • Ford-Fulkerson (max przepływ)
  • Teskty
    • Funkcja knutha (max prefix będący prawidłowym sufixem)
    • Knuth-Morris-Pratt
    • Szablon słowa
    • Zliczanie słów w łańcuchu
    • Dzielenie łańcucha na słowa
    • Wyszukiwanie najdłuższego słowa w łańcuchu
    • Wyszukiwanie najdłuższego wspólnego podłańcucha
    • Wyszukiwanie najdłuższego wspólnego podciągu
    • Wyszukiwanie najkrótszego wspólnego nadłańcucha
    • Wyszukiwanie słów podwójnych
    • Wyszukiwanie palindromów
  • Graficzne
    • W którą stronę skręcamy przechodząc z punktu A do B
    • Współliniowość
    • Przecięcia
    • Miotły
    • Przynależność punktu do odcinka
    • Porządkowanie wierzchołków wg rosnących kątów nachylenia ich wektorów wodzących
  • Inne
    • Find and union
    • Drzewa przedziałowe
Lista algorytmów przez szkodnikszkodnik, 12 Jan 2009 21:10

W w sobotę 20 grudnia planuję zorganizować spotkanie które podsumuje przygotowania do pierwszego etapu.
Postaram się o świąteczną atmosferę ……………….

The ATM is out of money! (HS08MATM):

#include <iostream>
using namespace std;
bool execute(int * bank, int wyplata){ //wykonujemy wyplate z bankomatu
    if(wyplata>bank[0]*5+bank[1]*10+bank[2]*20+bank[3]*50)return false; //jezeli nie ma odpowiedniej ilosci gotowki to zwracamy false
    int twenties=0, tens=0, fifs=0, fifties=0, twenties2=0, tens2=0, fifs2=0, fifties2=0, pos1=0, pos2=0, wyplata2=wyplata;
    fifties=wyplata/50; 
    if(fifties>bank[3]){
        fifties=bank[3];
    }
    wyplata-=fifties*50;
    pos1+=fifties;
    twenties=wyplata/20;
    if(twenties>bank[2]){
        twenties=bank[2];
    }
    wyplata-=twenties*20;
    pos1+=twenties;
    tens=wyplata/10;
    if(tens>bank[1]){
        tens=bank[1];
    }
    wyplata-=tens*10;
    pos1+=tens;
    fifs=wyplata/5;
    if(fifs>bank[0]){
        fifs=bank[0];
    }
    wyplata-=fifs*5;
    pos1+=fifs;
    /*-----------------------------*/ //oddziela dwa bloki kodu obliczajace dwa rozne sposoby wyplaty
    twenties2=wyplata2/20;
    if(twenties2>bank[2]){
        twenties2=bank[2];
    }
    wyplata2-=twenties2*20;
    pos2+=twenties2;
    tens2=wyplata2/10;
    if(tens2>bank[1]){
        tens2=bank[1];
    }
    wyplata2-=tens2*10;
    pos2+=tens2;
    fifs2=wyplata2/5;
    if(fifs2>bank[0]){
        fifs2=bank[0];
    }
    wyplata2-=fifs2*5;
    pos2+=fifs2;
    fifties2=wyplata2/50;
    if(fifties2>bank[3]){
        fifties2=bank[3];
    }
    wyplata2-=fifties2*50;
    pos2+=fifties2;
    if(pos1<pos2){ //jezeli wyplata pierwszym sposobem jest bardziej korzystna to wyplacamy wedlug niej
        bank[0]-=fifs; bank[1]-=tens; bank[2]-=twenties; bank[3]-=fifties;
        if(wyplata>0 || pos1>50 || bank[0]<0 || bank[1]<0 || bank[2]<0 || bank[3]<0)return false;
    }else{ //w innym przypadku wyplacamy wedlug drugiego sposobu
        bank[0]-=fifs2; bank[1]-=tens2; bank[2]-=twenties2; bank[3]-=fifties2;
        if(wyplata2>0 || pos2>50 || bank[0]<0 || bank[1]<0 || bank[2]<0 || bank[3]<0)return false;
    }
    return true; //zwracamy true
}
int main(){
int bank[4];
cin>>bank[0]>>bank[1]>>bank[2]>>bank[3]; //wczytujemy ilosci banknotow
while(execute(bank, 1995))cout<<"1995 "; //wyplacamy 1995 dopoki nie zablokujemy bankomatu
cout<<"1995"; //wypisujemy kwote blokujacej wyplaty
return 0; 
}

Zadanie polega na zablokowaniu bankomatu jak najmniejsza liczbą wypłat. Zaznaczam, że to rozwiazanie nie jest optymalne, dostało 8.8914/10 pkt. Wyplacam poprostu najbardziej banknotożerna liczbe z przedzialu <5, 2000>, az do zablokowania bankomatu

Illegible Account Numbers (HS08IBAN):

#include <iostream>
#include <math.h>
bool validate(int* IS,char* k,int si,int sl,int st,int tp){ //funkcja sprawdza poprawnosc numeru konta wzgledem standardu IBAN
    int r=0,IB[7];
    memcpy(IB,IS,sizeof(int)*7);
    for(int i=1;i<7;i++){
        if(i==sl)IB[i]+=tp*(int)(pow(10, double(st)));
        r=(r*(int)(pow(10, 4))+IB[i])%97;
    }
    r=(r*(int)(pow(10, 6))+IB[0])%97;
    if(r==1){
        k[si]=tp+48;
        return true;
    }
    return false;
}
int main(){
char * konto; int * IBAN; int t=0, stari=0, starpl=0, starpot=0, index=0, podliczba=0, pot10=3, tmp=0; char c; double sum=0.0, wyplata=0.0;
scanf("%d", &t); //wczytujemy ile razy wykonujemy program
for(int i=0; i<t; i++){
    konto=new char[29]; IBAN=new int[7]; stari=0; starpl=0; starpot=0; index=0; podliczba=0; pot10=3; tmp=0;
    for(int i=0; i<7; i++)IBAN[i]=0;
    while((c=getchar())!=';'){ //pobieramy znaki az do wczytania ";"
        if(pot10<0){podliczba++; pot10=3;}
        if(c>64 && c<91){ //jezeli znak jest litera ..
            IBAN[podliczba]+=(c-55)*(int)(pow(10, double(pot10+(index==0 ? 1 : 0)))); //zwiekszamy aktualna podliczbe o wczytana kozystajac z wlasnosci systemu dziesietnego
            konto[index]=c; //dodajemy do ciagu wczytany znak
            index++; pot10--;
        }else if(c>47 && c<58){ //jezeli znak jest cyfra ...
            IBAN[podliczba]+=(c-48)*(int)(pow(10, double(pot10))); //powiekszamy podliczbe korzystajac z wlasnosci systemu dziesietnego
            konto[index]=c; //dodajemy znak do ciagu
            index++; pot10--;
        }else if(c=='*'){ //jezeli wczytalismy gwiazdke
            stari=index; //zapamietujemy index gwiazdki
            starpl=podliczba; //zapamietujemy podliczbe gwiazdki
            starpot=pot10; //zapamietujemy stan zmiennej pot10 w chwili wczytania gwiazdki
            konto[index]=c; //powiekszamy ciag o znak
            index++; pot10--;
        }
    }
    if(stari!=0)while(!validate(IBAN, konto, stari, starpl, starpot, tmp))tmp++; //jezeli sa jakies gwiazdki to dopoki numer sie nie zgadza ze standardem IBAN
    std::cin>>wyplata; //pobieramy wyplate
    sum+=wyplata; //powiekszamy sume o aktualna wyplate
    for(int i=0; i<strlen(konto); i++){
        putchar(konto[i]); //wypisujemy znak z ciagu
        if((i+1)%4==0 && i<27)putchar(' '); 
    }
    printf("; %.2f\n", wyplata); //wypisujemy kwote wyplaty z dokladnoscia do 2 miejsc po przecinku
    delete[] konto; delete[] IBAN;
}
printf("%.2f", sum); //wypisujemy sume wyplat z dokladnoscia do 2 miejsc po przecinku
}

W zadaniu mamy uzupelnic numery kont bankowych napisanych w standardzie IBAN o brakujace znaki oraz zsumowac wyplaty. Zadanie nie wymaga glebszego wytlumaczenia. Wystarczy przestudiowanie specyfikacji standardu IBAN (pl.wikipedia.org/wiki/IBAN)

Sweet Option (HS08FCON):

#include <iostream>
using namespace std;
unsigned long long wspn(unsigned long long n, unsigned long long k){ //funkcja wspn liczy współczynnik newtona dla podanego n i k
    unsigned long long wynik=1, wynikr=0; // deklarujemy zmienne lokalne
    if(n-k < k)k = n-k; //jezeli n-k < k to zmniejszamy k w celu zmniejszenia ilosci wykonywanych obliczen
    for(unsigned long long i=1; i<=k; i++){
        wynikr = wynik%i; //liczymy reszte z dzielenia wyniku przez i z petli
        wynik = wynik/i; //wynik rowny jest wynikowi przez i
        wynik = wynik*(n-i + 1) + ((wynikr*(n-i + 1))/i); powiekszamy wynik (dzieki zastosowaniu reszty z dzielenia nie ma problemow z zakresem zmiennych)
    }
    return wynik; //zwraca wynik dzialania funkcji
}
long double i4multiply(unsigned long long S0, unsigned long long X, unsigned long long k, unsigned long long n, long double u, long double d, long double p, long double q){ //funkcja liczy schemat bernoulliego dla podanych danych; wykonywane operacje sa rownoznaczne z wykonaniem wzoru: (n nad k) * p^k * q^(n-k)
    long double cena=(long double)(S0);
    long double Y=(long double)(X);
    for(unsigned long long i=0; i<n-k; i++)cena*=d*q;
    cena *= wspn(n, k);
    for(unsigned long long i=0; i<k; i++)cena*=u*p;
    for(unsigned long long  i=0; i<n-k; i++)Y*=q;
    Y *= wspn(n, k);
    for(unsigned long long  i=0; i<k; i++)Y*=p;
    return (cena-Y>0 ? cena-Y : 0);
}
int main(){
    ios_base::sync_with_stdio(0); //przyspieszamy wejscie i wyjscie
    unsigned long long  T, X, S0; //deklaracja zmiennych
    long double p, u, d, SPRAWIEDLIWA=0.0; //deklaracja zmiennych
    cin>>T>>X>>S0>>p>>u>>d; //wczytujemy
    unsigned long long j=0; //deklarujemy
    while(j<T){ //dopoki j < T ...
        SPRAWIEDLIWA += i4multiply(S0, X, T-j, T, u, d, p, 1-p); //powiekszamy sprawiedliwa cene o schemat newtona z odpowiednich danych
        j++;
    }
    cout.setf(ios::fixed); //wylaczamy notacje naukowa
    cout.precision(2); //ustalamy precyzje do 2 miejsc po przecinku
    cout<<SPRAWIEDLIWA<<endl; //wypisujemy wynik
}

Zadanie polega na obliczeniu sprawiedliwej ceny na produkt po T dniach znajac prawdopodobienstwo wzrostu i spadku ceny w kazdym dniu, cene poczatkowa, cene proponowana oraz procent o jaki cena spada i procent o jaki cena rosnie. Zadanie mozna sprowadzic do wykonania proby bernoulliego z zachowaniem odpowiedniej analizy wynikow tzn sprawdzamy czy bardziej nam sie oplaca zaplacic po cenie proponowanej czy po naszej obliczonej.

Attractive Loan (HS08RBRT):

#include <iostream>
#include <math.h>
using namespace std;
int main(){
      double p=0, kapitalowa=0, x=0; //deklaracje zmiennych
      cin>>p; //wczytujemy kwote pozyczki
      kapitalowa=0.02*p; //liczymy czesc kapitalowa
      for(int i=0; i<50; i++){
           x+=ceil(kapitalowa+p*0.01); //powiekszamy kwote zobowiazan
           p-=kapitalowa; //zmniejszamy kwote pozyczki
      }
      cout<<x<<endl; //wypisujemy laczna kwote zobowiazan
      return 0;
}

Jest to zadanie z typu bardzo łatwych i jedyny problem w nim może polegać na niedostatecznej znajomości terminologii …

I etap konkursu zakończony :).
Gratuluję wyniku :)

7 PL IV Liceum Ogólnokształcące im. Hanki Sawickiej w Kielcach 244.1855918993

Dołączyliście do najlepszych szkół w Polsce :)

Proponuję w tym wątki powklejać kody rozwiązanych zadań.
Taki "zbiór" będzie przydatny dla Was i dla Waszych młodszych kolegów :)

Sprawdziłem twoje testy, wszystkie odpowiedzi takie same. Jakimś cudem na pingwinie działa mi o wiele szybciej (wszystkie testy poniżej 3 sekund) ;D. Tak więc luzik i to rozwiązanie jest na pewno dobre …

Re: Słonie przez tu_rutu_ru, 04 Nov 2008 16:31
Słonie
szkodnikszkodnik 29 Oct 2008 22:52
w dyskusji Zadania / Olimpiada informatyczna » Słonie

Napisałem w bashu skrypt który kompiluje rozwiazanie, generuje testy wykonuje je na naszym rozwiazaniu, pokazuje czas wykonania, sprawdza z moimi opowiedziami i w razie róźnic je pokazuje. Plik z rozwiązaniem musi się nazywac slo.cpp. Mam nadzieję że się przyda :-) http://wrzucacz.pl/file/2391225320480

Działa to tak:

chmod +x sprawdzarka
./sprawdzarka
Słonie przez szkodnikszkodnik, 29 Oct 2008 22:52
Profilery
szkodnikszkodnik 20 Oct 2008 21:10
w dyskusji Programowanie / Narzędzia » Profilery

Najpopularniejszym profilerem w c++ jest gprof.

http://www.g2inf.one.pl/referaty/.mylka/gprof/index.html
http://student.agh.edu.pl/~marcnowa/referat/
http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html
http://linuxgazette.net/100/vinayak.html

To bardzo przydatne narzędzie pomaga nam zobaczyć ile trwa wykonanie poszczególnych funkcji czy nawet linijek kodu. Można także dowiedzieć się ile razy dana funkcja czy linijka była wykonana. Ja na pewno będę z niego korzystał przy testowaniu zadań z olimpiady.

Profilery przez szkodnikszkodnik, 20 Oct 2008 21:10

--NWD--

Napisz funkcję:

int nwd(int a, int b);

która oblicza największy wspólny dzielnik liczb a i b,

0 <= a,b <= 1000000

Input

W pierwszej linii liczba testów t, w kolejnych liniach po dwie liczby w każdym wierszu.
Output

W każdej linii jedna liczba - wynik działania funkcji nwd
Example

Input:
5
1 4
4 1
12 48
48 100
123456 653421

Output:
1
1
12
4
3

Rozwiązanie:

#include <cstdlib>

int nwd(int a, int b)
{
while(a!=b)
{
if (a>b)
{
a = a - b;
}
else{
b = b-a;
}
}
return a;
}

int main()
{
int t;
scanf("%d",&t);
int a,b;
while(t)
{
scanf("%d%d", &a,&b);
printf("%d\n",nwd(a,b));
t—;
}
return 0;
}

Dla początkujących :)) przez Grzegorz3284Grzegorz3284, 18 Oct 2008 09:58

To była XII Olimpiada Informatyczna 2004/2005.
Tu można pobrać książeczkę http://www.oi.edu.pl/.

Re: High School Programming League przez szkodnikszkodnik, 15 Oct 2008 18:20
strona 1 z 212następna »
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License