#include #define MaxN 1000 struct PolozkaFrobniku { int Delka; int Soucet; }; int N,K,Cisla[MaxN]; int AktualniDelka,AktualniSoucet; int Levy,Pravy; // aktuálně zpracovávané řady struct PolozkaFrobniku Frobnik[MaxN]; // je vysvětlen v popisu řešení int Vrchol,Dno; // vrchol a dno zásobníku double NejPrumer; int NejLevy,NejPravy; // nejlepší úsek - levý, pravý konec a průměr int main(void) { int index; printf("Zadej počet čísel:");scanf("%d",&N); printf("Zadej K:");scanf("%d:",&K); printf("Zadej čísla:"); for (index = 0;index < N;index++) scanf("%d",&Cisla[index]); // načteno Vrchol = 0;Dno = 0; // inicializace frobníku AktualniDelka = K; AktualniSoucet = 0; for (index = 0;index < K;index++) AktualniSoucet += Cisla[index]; // Aktuální kus řady je prvních K čísel Levy = 0;Pravy = K-1; //konce zkoumané posloupnosti NejLevy = 0;NejPravy = K-1; NejPrumer = AktualniSoucet / (double) K; // a je to zatím nejlepší úsek for (Pravy = K;Pravy < N;Pravy++) { // teď projdeme všechny možné pravé konce AktualniSoucet += Cisla[Pravy]; AktualniDelka++; // přidáme číslo na konec posloupnosti Frobnik[Vrchol].Delka = 1; Frobnik[Vrchol].Soucet = Cisla[Pravy - K]; // přidáme číslo na frobník Vrchol++; // a teď frobník opravíme while ( (Vrchol - Dno > 1) && // dokud tam jsou alespoň 2 prvky (Frobnik[Vrchol-1].Soucet * Frobnik[Vrchol-2].Delka < Frobnik[Vrchol-2].Soucet * Frobnik[Vrchol-1].Delka)) //a ve frobníku je chyba { Vrchol--; Frobnik[Vrchol-1].Soucet += Frobnik[Vrchol].Soucet; Frobnik[Vrchol-1].Delka += Frobnik[Vrchol].Delka; // slučujeme } // nyní jdeme opravit kandidáta na maximum while ((Vrchol != Dno) && // dokud je něco ve frobníku (Frobnik[Dno].Soucet * AktualniDelka < // a dokud vylepšujeme průměr AktualniSoucet * Frobnik[Dno].Delka)) { AktualniDelka -= Frobnik[Dno].Delka; Levy += Frobnik[Dno].Delka; AktualniSoucet -= Frobnik[Dno].Soucet; Dno++; } if (AktualniSoucet / (double) AktualniDelka > NejPrumer) { // našli jsme něco lepšího NejLevy = Levy; NejPravy = Pravy; NejPrumer = (double)AktualniSoucet / AktualniDelka; } } printf("Nejvyšší průměr %g má úsek od %d do %d.",NejPrumer,NejLevy+1,NejPravy+1); return 0; }