← Back to topics
Topic

[za rajkona] C++

s
sidejan
Pohvala rajkon za C++ resenje problema 'Jagode' ;) samo napred!... Ova poruka sadrzi par komentara na C++ kod ... verujem da ce da koriste ... bar ce da vam skrate muke trazeci po dokumentaciji ...
NAPOMENA: ova poruka sadrzi delimican kod resenja problema 'Jagode' tako da ako niste jos uradili zadatak nemojte da 'kradete' resenje ...

#include <iostream>
#include <iomanip>
#include <cmath>

#include <vector> // sadrzi definiciju klase vector
#include <algorithm> // potreban za metod sort(pointer na pocetak, pointer na kraj, f-ja // uporedjivanja)
using namespace ; // kada ubacujes bilo koju klasu iz STLa moras da navedes ovaj namespace
// za sada ti nije bitno sta je ali ga uvek ubaci kad koristis nesto iz STLa

#define MaxN 200
// ovo je vise stvar ukusa ali ja licno sam se sad navikao da definisem for pod define
// npr:
// #define FOR(i, n) for (int i = 0 ; i < (n) ; i ++)
// pa posle pises samo FOR(i, n) { // u ovom bloku mogu da koristim i iako ga nisam prethodno
// deklarisao }
// a mozes da radis i varijacije na temu
// FORL(i, n, m) for (int i = (n) ; i < (m) ; i ++)
// i sl ... vise je stvari licnog ukusa i navike

using namespace std;

const double eps=10e-20;
double x[MaxN],y[MaxN],a[MaxN];
// ili vector<double> x, y, a ;
int n;


void init(){
cin >> n;
for (int i=0; i<n; i++){ cin >> x[i] >> y[i] >> a[i]; }
// a moze i cin >> tmp ; x.push_back(tmp) ;
// tako se ubacuje kad se radi o vectoru ...
// cin, cout su dobri i jednostavni za koriscenje, ali se pazi kad trebas
// da ucitavas/stampas vecu kolicinu podataka jer su sporiji od scanf/printf
}


// ovo ti je bespotrebna procedura
// ako hoces da zamenis neke dve stvari pisi slobodno swap(a, b)
// swap je overloadovana f-ja (tj. ako je zoves swap(double, double)
// ili swap(int, int) pozove onaj koji ti treba .. isti naziv za istu f-ju
// sa razlicitim parametrima
void swap(int i, int j){
double tmp=x[i]; x[i]=x[j]; x[j]=tmp;
tmp=y[i]; y[i]=y[j]; y[j]=tmp;
tmp=a[i]; a[i]=a[j]; a[j]=tmp;
}


// ovaj deo koda mozes jednostavno da zamenis sa
// sort(pointer_na_pocetak_niza_koji_hocu_da_sortiram, pointer_na_polje_posle_poslednjeg
// elementa_u_nizu_koji_hocu_da_sortiram[,f-ja uporedjivanja])
// gd je ova f-ja uporedjivanja opciona ... tj. mozes da pozoves i bez nje
// ako je niz integera onda ce ti sortirati u rastucem redosledu
// ako neces tako ili hoces da sortiras komplikovanije objekte onda moras da
// napises svoju f-ju
// tipa:
// bool myless(int a, int b) {
// return a<b ;
// }
// i posle pozoves:
// sort(x, x + n, myless)
// sortirace ti elemente u x [0], x [1] ... x [n - 1] po kriterijumu f-je myless
// i u ovom jednom redu stavis ovaj dosadan kod koji skoro pa svaki zadatak
// trazi ... a tako je dosadno kucati jedno te isto :(
int partition(int left, int right){
double pivot=x[right];
int i=left-1;
int j=right;
while (i<j){
do { i++; } while (x[i]<pivot);
do { j--; } while ((x[j]>pivot) && (j!=left));
if (i<j) swap(i,j);
}
swap(i,right);
return i;
}

void qsort(int left, int right){
if (left<right){
int pivot=partition(left,right);
qsort(left,pivot-1);
qsort(pivot+1,right);
}
}

// f-je ovog tipa koje su jednostavne ali se mozda mnogo puta pozivaju
// mogu da prouzrokuju bespotreban overhead pa je dobro staviti ih kao __inline f-je
// npr:
// __inline bool cmp(double x1, double x2){
// ili jos bolje pod #define
// #define cmp(x1, x2) (fabs((x1)-(x2))<eps)
// da bi se ubrzao rad
bool cmp(double x1, double x2){
return (fabs(x1-x2)<eps);
}


// postoji i f-ja binary_search u <algorithm> ... mada sam i ja kod ovog zadatka
// pisao svoju jer nekad nije bas najpogodnija ova njihova
double binSearch(double p, double q, double sum){



void solve(){
qsort(0,n-1);
// sort(x, x + n) ;
double sum=0;
for (int i=0; i<n; i++){
sum+=a[i]*a[i];
}

double x1=binSearch(x[0],x[n-1]+a[n-1],sum/3);
double x2=binSearch(x[0],x[n-1]+a[n-1],sum*2/3);

cout << setiosflags(ios::fixed) << setprecision(2) << x1 << endl;
cout << setiosflags(ios::fixed) << setprecision(2) << x2 << endl;
}


// ovo me podseca na moje prve programe u c-u kad sam presao sa pascala
// kako nas kratica i urosevic uce da pisemo 'kulturne' programe
// pa se covek navikne i ostane mu to ...
// {preProcess ;}
// readInput ;
// solve ;
// writeOutput ;
// su bili moji Pascal programi :)
int main(){
init();
solve();
}
s
sidejan
Ocigledno ovaj Forum interpretira text kao html :( .. ali nema veze
na pocetku je trebalo biti
#include '<' vector '>'
#include '<' algorithm '>'
s
sidejan
i posle
vector '<'double'>'
BEZ ' naravno ;)
s
sidejan
return a '<' b ;
s
sidejan
u stvari ti bi ovde trebao da imas
struct st {
double x, y, a;
} ;
vector'<'st'>' v ;
st s [MAXN] ;

bool myless(st s1, st s2) {
return s1.x < s2.x ; // npr. ili kako vec
}

i posle
sort(v.begin(), v.end(), myless) ;
ili
sort(s, s + n, myless) ;
a
adminModerator
Vishe ne pokauje html :)
a
adminModerator
Brzi prsti Z-Admin-a :D
r
rajkon
@sidejan

Hvala na savetima :)
n
nemusns
Posto cu verovatno i ja da ove godine da radim u c++ na takmicenju (sta ces kad nema jave :) ) i ja ti se zahvaljujem na savetima.

P.S. Svaka cast na reakciji admina :)
r
rajkon
Koje sortiranje je implementirano u funkciji sort koju si spomenuo?
s
sidejan
Sa zvanicnog site-a:
http://www.sgi.com/tech/stl/sort.html

[2] Earlier versions of sort used the quicksort algorithm (C. A. R. Hoare, Comp. J. 5, 1962), using a pivot chosen by median of three (R. C. Singleton, CACM 12, 1969). Quicksort has O(N log(N)) average complexity, but quadratic worst-case complexity. See section 5.2.2 of Knuth for a discussion. (D. E. Knuth, The Art of Computer Programming. Volume 3: Sorting and Searching. Addison-Wesley, 1975.) The current implementation of sort, however, uses the introsort algorithm (D. R. Musser, "Introspective Sorting and Selection Algorithms", Software Practice and Experience 27(8):983, 1997.) whose worst case complexity is O(N log(N)). Introsort is very similar to median-of-three quicksort, and is at least as fast as quicksort on average.
m
mikamostar
kako najlakse nauciti raditi u c++
neka netlo pmogne molim.
r
renovator
pa ja sam ga poceo uciti tako sam nasao nesto osnovno iz sintaxe ( kako dekl. promenljive, petlje, funkcije i kako da stampam i skeniram vrednosti ) na internetu, procitao to , i odmah krenuo sa kucanjem..

Tako sam otkucao par programa..Pa sam vremenom ,usput, prelazio na neke malo naprednije stvari...

Ali, ako nisi upoznat ni sa jednim programskim jezikom,mozda je bolje da prvo naucis Pascal..Posle ces videti da su svi oni u sustini "isto"..