Byl vydán Mozilla Firefox 146.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 146 bude brzy k dispozici také na Flathubu a Snapcraftu.
Před rokem převzala Digitální a informační agentura (DIA) vlastnictví a provoz jednotné státní domény gov.cz. Nyní spustila samoobslužný portál, který umožňuje orgánům veřejné moci snadno registrovat nové domény státní správy pod doménu gov.cz nebo spravovat ty stávající. Proces nové registrace, který dříve trval 30 dní, se nyní zkrátil na několik minut.
IBM kupuje za 11 miliard USD (229,1 miliardy Kč) firmu Confluent zabývající se datovou infrastrukturou. Posílí tak svoji nabídku cloudových služeb a využije růstu poptávky po těchto službách, který je poháněný umělou inteligencí.
Nejvyšší správní soud (NSS) podruhé zrušil pokutu za únik zákaznických údajů z e-shopu Mall.cz. Incidentem se musí znovu zabývat Úřad pro ochranu osobních údajů (ÚOOÚ). Samotný únik ještě neznamená, že správce dat porušil svou povinnost zajistit jejich bezpečnost, plyne z rozsudku dočasně zpřístupněného na úřední desce. Úřad musí vždy posoudit, zda byla přijatá opatření přiměřená povaze rizik, stavu techniky a nákladům.
Organizace Free Software Foundation Europe (FSFE) zrušila svůj účet na 𝕏 (Twitter) s odůvodněním: "To, co mělo být původně místem pro dialog a výměnu informací, se proměnilo v centralizovanou arénu nepřátelství, dezinformací a ziskem motivovaného řízení, což je daleko od ideálů svobody, za nimiž stojíme". FSFE je aktivní na Mastodonu.
Paramount nabízí za celý Warner Bros. Discovery 30 USD na akcii, tj. celkově o 18 miliard USD více než nabízí Netflix. V hotovosti.
Nájemný botnet Aisuru prolomil další "rekord". DDoS útok na Cloudflare dosáhl 29,7 Tbps. Aisuru je tvořený až čtyřmi miliony kompromitovaných zařízení.
Iced, tj. multiplatformní GUI knihovna pro Rust, byla vydána ve verzi 0.14.0.
FEX, tj. open source emulátor umožňující spouštět aplikace pro x86 a x86_64 na architektuře ARM64, byl vydán ve verzi 2512. Před pár dny FEX oslavil sedmé narozeniny. Hlavní vývojář FEXu Ryan Houdek v oznámení poděkoval společnosti Valve za podporu. Pierre-Loup Griffais z Valve, jeden z architektů stojících za SteamOS a Steam Deckem, v rozhovoru pro The Verge potvrdil, že FEX je od svého vzniku sponzorován společností Valve.
Byla vydána nová verze 2.24 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.
Kevin je právě na horách a lyžuje. Stojí na vrcholu sjezdovky před svou poslední jízdou, za chvíli půjde na chatu opékat párky. Sjezdovku už dobře zná, každé místo projel snad stokrát a pamatuje si, jak se mu které líbí. Všechna jsou podle toho ohodnocená celými čísly.
1
2 3
4 1 1
2 5 0 2
Kevin by tedy chtěl, aby součet ohodnocení míst, přes která při poslední jízdě projede, byl co největší.
Na travních lyžích se dá jezdit z kopce a přitom zatáčet doleva nebo doprava. Z každé pozice na svahu se tak dá dostat na nejvýše dvě další pozice ležící pod ní.
Tvar vstupu: Pro jednoduchost bude kopec zadán po řádcích. Na prvním řádku bude číslo N udávající výšku kopce. Na dalších N řádcích bude vždy na i-tém řádku i celých čísel udávajících ohodnocení míst na kopci na i-té hladině od vrcholu, čísla budou oddělena mezerami.
Jízda doleva je v našem zápisu svahu ekvivalentní sestupu na další řádek a jízda doprava sestupu na další řádek a posunutí o pozici doprava.
Tvar výstupu: Na výstup vypište jedno celé číslo udávající maximální součet ohodnocení poslední Kevinovy jízdy z prvního řádku na libovolné místo na spodním řádku.
Program posílám v příloze. Problém je, že si poradí s kopcem vysokým 10 řádků, ale s kopcem vysokým 40 řádků už ne. A to by měl zvládnout i vstup 1000 řádků. Vstupy zapíše do pole správně, ale vrátí výsledek 0. Chyba tak musí být v rekurzivní funkci
Všem předem děkuji za tipy.
Řešení dotazu:
Mam pocit ze i bez kouknuti na program si dovolim tvrdit ze sis sam odpovedels v posledni, teda vlastne predposledni vete.
Tim samozrejme myslim tu rekurzi. Pokud chces aby to zvladalo vetsi vstupy tak urcite nepouzivej rekurzi.
JJ to je mozne, jak jsem psal kod jsem nestudoval, ale jen jsme vychazel s predpokladu ze rekurze je sice velmi dobre citelna, ale casto to neni idealni reseni.
Tak on je problem ze rekurze se i hure optimalizuje s pohledu kompilatoru(optimalizatoru), dalsi problem s rekurzi je ze vyuziva zasobnik, ktery ma vetsinou nejak omezenou velikost. Samozrejme citelnost je velmi dulezita, takze pokud rekurze dostacuje tak bych ji zvolil taky. Bohuzel si nevzpominam na moc pripadu, kde bych rekurzi vyuzil, teda krom pripadu, kde jsme potreboval nazorne ukazat nejakej algoritmus.
Moc jsem ten program nezkoumal, ale při výšce kopce > 31 ti přeteče ten výpočt mocniny, takže bych to tipoval na problém tady. K tomu 2 poznámky - počítat mocninu dvou násobenim je šílenost, podívej se na bitové posuvy.
A za druhé - i kdyby si měl tu proměnnou 64bit a mohl alokovat tolik paměti pro to pole (což je samozřejmě nesmysl), tak stejně končíš u výšky 64... Tzn takto to opravdu řešit principielně nelze.
počítat mocninu dvou násobenim je šílenost, podívej se na bitové posuvy.Slušný optimalizátor v překladači z násobení dvěma udělá bitový posun tak jak tak. Násobení dvěma je čitelnější pro programátora.
for(int i = 0; i < exponent; i++)
{
vysledek *= 2;
}
Lze napsat jen toto:
vysledek <<= exponent;
Coz moderni optimalizator dokaze taky :), ale kazdopadne tady uz bych nemluvil o tom ze to je citelnejsi a nebo ze se na to da zcela spolehnout.
Pokud muzu neco doporucit, tak asi toto: cti to radek po radku, hodnotu po hodnote. Vzdy si pamatuj predchozi radek a ten pricitej k tomu dalsimu co ctes tak jak je treba dle zadani a u posledniho radku vyber maximum.
dnes jsem unavenej zitra poslu pseudo kod
Tak nakonec misto pseudo jsem to napsal v jazyku D. Jsem uz unaveny takze nerucim zcela za spravnost:
import std.stdio;
import std.algorithm;
import std.conv;
enum MAX_ROW_COUNT = 1000;
enum BUF_SIZE = 65535;
void main(string[] args)
{
int[MAX_ROW_COUNT] row;
char[] buf = new char[BUF_SIZE];
auto f = File("test.txt");
size_t len, rowCount;
while((len = f.readln(buf)) != 0) {
int lastVal = row[0];
char[] rowData = buf[0 .. len];
size_t index = 0;
foreach (val; rowData.splitter(' ').map!(a=>parse!int(a))) {
int tmp = row[index];
row[index] = lastVal + val;
lastVal = tmp;
++index;
}
++rowCount;
}
writeln(minCount!("a > b")(row[0 .. rowCount])[0]); // seems wierd but minCount return maximum :)
}
import std.stdio;
import std.algorithm;
import std.conv;
enum MAX_ROW_COUNT = 1000;
enum BUF_SIZE = 65535;
void main(string[] args)
{
int[MAX_ROW_COUNT] row;
char[] buf = new char[BUF_SIZE];
auto f = File("test.txt");
size_t len, rowCount;
int[2] lastVal;
while((len = f.readln(buf)) != 0) {
char[] rowData = buf[0 .. len];
size_t index = 0;
foreach (val; rowData.splitter(' ').map!(a=>parse!int(a))) {
lastVal[index%2] = row[index];
row[index] = max(lastVal[0] + val, lastVal[1] + val);
++index;
}
++rowCount;
}
writeln(reduce!("max(a,b)")(row[0 .. rowCount]));
}
Děkuji všem za rady. Jsem ještě začátečník, a abych pravdu řekl, tak jsem z Vašich odpovědí pořád nepochopil, proč mi program nefunguje :) Kód, který napsal Kozzi nemůžu použít, protože pracuji v c++ a ani mu pořádně nerozumím, abych ho přepsal.
brát vždy maximum z dvou možných hodnot na předchozím řádkuToto nechápu. Vždyť na posledním řádku můžu dostat hodnotu, která bude větší, než všechny ostatní součty, tzn. že bude největší právě tato cesta. Těmto algoritmům nerozumím, ale ten svůj jsem přepracoval, takže hodnoty neukládá do pole. Nyní dělá toto: Prochází cesty úplně vlevo a sčítá. Až dojde na konec rozhodne, zda je součet větší, než zatím největší nalezení, případně ho zapíše. Následně se vrátí o vrstvu výš a vezme cestu vpravo, atd. atd. Pokud můžu mít dotaz, tak pořád nemůžu pochopit, proč mám číst vstup po řádcích. Původně jsem takový systém měl. Přečetl řádek, sečetl všechny kombinace, a ty zapsal do pole. Nakonec našel v poli největší hodnotu. Ten jsem ale přepracoval, protože se mi zdál zbytečně složitý. Díky za trpělivost a případné odpovědi :) V příloze posílám zdrojový kód.
1
2 3
4 1 1
2 5 0 2
Po zpracovani 1. radku [1]JJ presne, to je vice mene to co dela muj kod, teda on alokuje zbytecne protoze nevyuiva informace o tom kolik realne radku tam bude.
Mocnina dvojky je mocná
2^40 = 1 099 511 627 776 * sizeof(int) = 4TiB RAM pro druhé pole
maximum int = 2^31 -1 = 2 147 483 647 * sizeof(int) = 8GiB RAM pro druhé pole
ALE narveš tam jen třicetjedničku (to je daň za nulu
):
1 073 741 824 * sizeof(int) = 4GiB RAM pro druhé pole
¡31 je max! - na 64bit systému (omezení int) na 32 bit s PAE je to 29 bez PAE 29 nebo 28 (omezení systému) - zjednodušeněZadej si 32 je docela pravděpodobné, že ti to vyhodí std::bad_alloc, bo fce mocninaDvojky() vrátí -2147483648 a to jaksi alokovat nelze.
Tiskni
Sdílej: