Chodzi tu o tą pętle. Jest problem z alokacją (tak to się chyba nazywa)
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);
}
1. Nie uzywaj nigdy (o ile nie jestes pewien, ze wiesz po co) typu float. Uzywaj double.
2. cout«setprecision(2)«fixed«D«endl;
dzięki poszło teraz, tylko zdaje mi się że coś z tym zaokrąglaniem nie tak wyszło. jak to inaczej zrobić??
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
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…
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
- 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
w dyskusji Hyde Park / Pogaduszki » Podsumowanie przygotowań do I etapu OI 2008
W w sobotę 20 grudnia planuję zorganizować spotkanie które podsumuje przygotowania do pierwszego etapu.
Postaram się o świąteczną atmosferę ……………….
w dyskusji Zadania / SPOJ » I etap konkursu High School Programming League 2008/2009
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
w dyskusji Zadania / SPOJ » I etap konkursu High School Programming League 2008/2009
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)
w dyskusji Zadania / SPOJ » I etap konkursu High School Programming League 2008/2009
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.
w dyskusji Zadania / SPOJ » I etap konkursu High School Programming League 2008/2009
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 …
w dyskusji Zadania / SPOJ » I etap konkursu High School Programming League 2008/2009
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 …
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
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.
--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.
OutputW każdej linii jedna liczba - wynik działania funkcji nwd
ExampleInput:
5
1 4
4 1
12 48
48 100
123456 653421Output:
1
1
12
4
3Rozwią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;
}
To była XII Olimpiada Informatyczna 2004/2005.
Tu można pobrać książeczkę http://www.oi.edu.pl/.