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

[C++] Problem z szukaniem najbliższej liczby do średniej ze zbioru

Ostatnio zmodyfikowano 2014-03-09 14:58
Autor Wiadomość
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 :
C/C++
#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 :)
P-105861
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.
P-105899
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
C/C++
aktualnyWynik.push_back( sredniaArytmetyczna / tablicaLiczb[ j ] );
na :
C/C++
aktualnyWynik.push_back( tablicaLiczb[ j ] / sredniaArytmetyczna );
P-105919
« 1 »
  Strona 1 z 1