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

Przykład z zadania z olimpiady informatycznej gimnazjalistów

Ostatnio zmodyfikowano 2016-03-30 21:19
Autor Wiadomość
antex123
Temat założony przez niniejszego użytkownika
Przykład z zadania z olimpiady informatycznej gimnazjalistów
» 2016-03-28 22:47:29
Witam , przygotowuję się do III etapu olimpiady informatycznej gimnazjalistów. http://main.edu.pl/pl/archive​/oig/6/lam . Pod podanym linkiem umieszczone zostało zadanie , które właśnie "studiuję". Zrozumiałem je , lecz nie rozumiem dlaczego w pierwszym przykładzie do zadania : 3 1 5
          0 3 5   odpowiedzią jest 2,125 , wyjaśni ktoś ? :) 
P-146671
DejaVu
» 2016-03-29 18:05:03
Trzeba policzyć sumę pól wszystkich trójkątów po optymalnym dowieszeniu dozwolonej ilości lamp.
P-146743
antex123
Temat założony przez niniejszego użytkownika
» 2016-03-29 22:14:17
rozumiem to , tylko nie rozumiem dlaczego wynik w pierwszym przykładzie wynosi 2,125 , moim zdaniem optymalnie powinniśmy powiesić na pozycji 1 i wtedy będziemy mieli sumę pól : 1*1/4+2*2/4+2*2/4=2,25 , a nie 2,125 i nie napisano czy trzeba na pozycjach całkowitych.
Btw pola tych trójkątów to (podstawa*podstawa)/4 , nie ? (upewniam się)
P-146758
michal11
» 2016-03-30 00:29:40
Ale to zadanie jest fatalnie opisane.
Tak, pola to (podstawa*podstawa)/4. Teoretycznie w paragrafie Wejście masz napisane, że pozycje są liczbami całkowitymi. Ale wychodzi 2,125 bo trzeba wziąć pozycje niecałkowite.
Coś tam nasmarowałem, wychodzi prawie dobrze, ale nie chce mi się tego poprawiać (a kod jest fatalny) i na pewno ci tego nie wytłumaczę:
C/C++
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include <cmath>

//====================================================================================================================

void printVector( const vector < double >& vec )
{
    for( auto it = vec.begin(); it != vec.end(); ++it )
    {
        cout << * it << " ";
    }
    cout << endl;
}

void addLamp( vector < double >& lampPositions, int val );

//====================================================================================================================

int main()
{
   
    int howManyAlready, howmanyToBuy, hallLength;
    vector < double > lampPositions;
   
    cin >> howManyAlready >> howmanyToBuy >> hallLength;
   
    lampPositions.reserve( hallLength );
   
    int readedPos;
   
    for( int i = 0; i < howManyAlready; ++i )
    {
        cin >> readedPos;
        lampPositions.push_back( readedPos );
    }
   
    //printVector(lampPositions);
   
    for( int i = 0; i < howmanyToBuy; ++i )
    {
        addLamp( lampPositions, howmanyToBuy - i );
        //printVector(lampPositions);
    }
   
    decltype( lampPositions ) result( lampPositions.size() );
    adjacent_difference( lampPositions.begin(), lampPositions.end(), result.begin() );
    //printVector(result);
    double minSurface = 0.d;
    minSurface = accumulate( result.begin(), result.end(), minSurface,[]( double & sum, double & current ) { return sum += current * current / 4.d; } );
   
    cout << minSurface << endl;
   
   
   
    return 0;
}
//====================================================================================================================
void addLamp( vector < double >& lampPositions, int val )
{
    vector < double > result( lampPositions.size() );
    adjacent_difference( lampPositions.begin(), lampPositions.end(), result.begin() );
   
    auto wherePutLamp = distance( result.begin(), max_element( result.begin(), result.end() ) );
   
    lampPositions.insert( lampPositions.begin() + wherePutLamp, lampPositions[ wherePutLamp - 1 ] +( lampPositions[ wherePutLamp ] - lampPositions[ wherePutLamp - 1 ] ) / static_cast < double >( val == 1 ? 2
        : val ) );
}
//*****************************************************************************
[ cpp ]

Tylko mam pro ś b ę, ż eby ś go sprawdzi ł czy rzeczywi ś cie ź le dzia ł a i tylko mia ł em szcz ę ś cie do danych testowych.
P-146760
antex123
Temat założony przez niniejszego użytkownika
» 2016-03-30 14:48:23
Dzięki wlk , ale jeśli niecałkowite to z jaką dokładnością ? Chyba sb podaruję to zadanie xD
P-146774
michal11
» 2016-03-30 16:21:08
jeśli niecałkowite to z jaką dokładnością ?

Nie umiem odpowiedzieć na to pytanie, obstawiałbym tylko jedno miejsce po przecinku, ale nie mam pojęcia. Moim zdaniem te pozycje powinny być całkowite, ale wtedy nie zgadzają się wyniki.
P-146776
antex123
Temat założony przez niniejszego użytkownika
» 2016-03-30 19:49:43
wyskakuje mi błąd w twoim kodzie w funkcji printvector .
P-146785
michal11
» 2016-03-30 20:30:50
Jaki błąd ?

To jest w sumie funkcja pomocnicza, nie jakoś specjalnie potrzebna do działania programu.
P-146790
« 1 » 2
  Strona 1 z 2 Następna strona