[C++] Problem z szukaniem najbliższej liczby do średniej ze zbioru
Ostatnio zmodyfikowano 2014-03-09 14:58
domin568 Temat założony przez niniejszego użytkownika |
[C++] Problem z szukaniem najbliższej liczby do średniej ze zbioru » 2014-03-08 15:55:08 Witam, piszę zadanie na SPOJ, i mam problem… w zadaniu trzeba znaleźć liczbę ze zbioru która jest najbliższa do średniej ze zbioru, czyli wygląda to mniej więcej tak : Input : 2 // ilosc przypadkow testowych 4 8 7 6 2 // 4 oznacza ilosc liczb ktore maja byc wpisane SREDNIA Z TYCH LICZB TO 5,75 3 1 2 3 // 3 oznacza ilosc liczb ktore maja byc wpisane SREDNIA Z TYCH LICZB TO 2 Output : 6 // najbliższa liczba obecna do średniej ze zbioru 2 Taki przykład idealnie mi działa mi w moim programie, ale problem się robi kiedy jest tak : Input : 1 // ilosc przypadkow testowych 6 1 2 3 4 5 6 // SREDNIA 3.5 Output (w moim programie) 4 Teoretycznie jest to prawdą, bo 4 jest tak samo blisko 3,5 jak 4, jednak SPOJ mi tego nie przyjmuję. Tutaj mój kod : #include <vector> #include <iostream> double sredniaArytmetycznaFunc( std::vector < double > vektor ) { double suma = 0; for( int i = 0; i < vektor.size(); i++ ) { suma = suma + vektor[ i ]; } return suma / vektor.size(); }
int main( int argc, const char * argv[] ) { std::vector < double > tablicaLiczb; double sredniaArytmetyczna; int liczbaTestow; int iloscLiczbWpisywanych; int sprawdzanaLiczba; double roznica = 10000000; double min = roznica; const double one = 1; int tmpWynik = 0; std::vector < int > wynik; double minGlobalne = 0; std::vector < double > aktualnyWynik; std::cin >> liczbaTestow; int tmpLiczba; for( int i = 0; i < liczbaTestow; i++ ) { tablicaLiczb.clear(); aktualnyWynik.clear(); std::cin >> iloscLiczbWpisywanych; for( int j = 0; j < iloscLiczbWpisywanych; j++ ) { std::cin >> tmpLiczba; tablicaLiczb.push_back( tmpLiczba ); } sredniaArytmetyczna = sredniaArytmetycznaFunc( tablicaLiczb ); min = 10000000; for( int j = 0; j < tablicaLiczb.size(); j++ ) { aktualnyWynik.push_back( sredniaArytmetyczna / tablicaLiczb[ j ] ); if( aktualnyWynik[ j ] > 1 ) { roznica = aktualnyWynik[ j ] - one; } if( aktualnyWynik[ j ] < 1 ) { roznica = one - aktualnyWynik[ j ]; } if( aktualnyWynik[ j ] == 1 ) { roznica = 0; wynik.push_back( sprawdzanaLiczba ); break; } if( roznica < min ) { tmpWynik = tablicaLiczb[ j ]; min = roznica; minGlobalne = min; } if( j == tablicaLiczb.size() - 1 ) { wynik.push_back( tmpWynik ); } } } for( int j = 0; j < wynik.size(); j++ ) { std::cout << wynik[ j ] << std::endl; } return 0; }
Kod nie jest idealny pod względem optymalizacji, ale działa :) Liczę na waszą pomoc :) |
|
ison |
» 2014-03-08 23:42:32 4 Teoretycznie jest to prawdą, bo 4 jest tak samo blisko 3,5 jak 4, jednak SPOJ mi tego nie przyjmuję. |
( http://pl.spoj.com/problems/PP0604A/): Dla każdego testu, w kolejnych liniach, jedna liczba - pierwszy element tablicy, którego wartość jest najbliższa wartości średniej.
|
|
|
domin568 Temat założony przez niniejszego użytkownika |
» 2014-03-09 14:58:07 Już sam znalazłem wynik, wystarczyło dzielić przez inną kolejnośc liczb a mianowicie aktualnyWynik.push_back( sredniaArytmetyczna / tablicaLiczb[ j ] );
na : aktualnyWynik.push_back( tablicaLiczb[ j ] / sredniaArytmetyczna );
|
|
« 1 » |