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ś ? :) |
|
DejaVu |
» 2016-03-29 18:05:03 Trzeba policzyć sumę pól wszystkich trójkątów po optymalnym dowieszeniu dozwolonej ilości lamp. |
|
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ę) |
|
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ę: #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 ); } for( int i = 0; i < howmanyToBuy; ++i ) { addLamp( lampPositions, howmanyToBuy - i ); } decltype( lampPositions ) result( lampPositions.size() ); adjacent_difference( lampPositions.begin(), lampPositions.end(), result.begin() ); 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. |
|
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 |
|
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. |
|
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 . |
|
michal11 |
» 2016-03-30 20:30:50 Jaki błąd ?
To jest w sumie funkcja pomocnicza, nie jakoś specjalnie potrzebna do działania programu. |
|
« 1 » 2 |