Temat: Czasy na SEK. Jakie mieliście.

Pierwsze moje zgłoszenie (dzieliło zawsze na 1000 pasków poziomych i #Instancji pasków pionowych):

1 OK 0.28s/1.00s 20 1/1
2 OK 1.99s/5.00s 18 1/1
3 OK 2.56s/8.00s 12 1/1
4 OK 3.27s/10.00s 20 1/1
5 OK 2.81s/10.00s 48 1/1
6 OK 3.41s/18.00s 20 1/1
7 OK 3.71s/22.00s 25 1/1
8 OK 3.95s/16.00s 50 1/1
9 OK 4.60s/12.00s 100 1/1
10 OK 3.32s/6.00s 100 1/1

Drugie (finalne) zgłoszenie (potencjalnie używało mniejszej liczby instancji niż dostarczonych, i mniejszej liczby pasków):

1 OK 0.15s/1.00s 20 1/1
2 OK 0.57s/5.00s 18 1/1
3 OK 1.12s/8.00s 12 1/1
4 OK 1.22s/10.00s 20 1/1
5 OK 1.47s/10.00s 48 1/1
6 OK 2.48s/18.00s 20 1/1
7 OK 3.30s/22.00s 25 1/1
8 OK 2.51s/16.00s 50 1/1
9 OK 3.55s/12.00s 100 1/1
10 OK 2.40s/6.00s 100 1/1

Gdyby trochę lepiej dofitować funkcję estimated_time(N, M, P, B) to pewnie by się jeszcze trochę dało zejść.

U mnie było:
NoN = NumberOfNodes();
best_runtime_us = 86400 * 1000000LL; // 1 day ~ infinity

for (p = 1; p <= NoN; ++p) {
for (i = 1; i <= 1000; ++i) {
// 12.3ns compute per cell (w praktyce chyba bliżej 5.7ns)
long long runtime_us = n * 123LL * m * (i + 1) / i / p / 10000;
// 0.500ms synchronization overhead (w praktyce chyba bliżej 1.9ms)
runtime_us += i * 500LL;
if (runtime_us < best_runtime_us) {
best_runtime_us = runtime_us;
best_nodes = p;
best_pieces = i;
};
if (i >= 10) i += 1;
if (i >= 100) i += 8;
};
};
NoN = best_nodes;
messages = best_pieces;

if (MyNodeId() >= NoN) return 0;

if (NoN == 1) messages = 1;

// should not happen, but safety first
if (messages > 1000) messages = 1000;
if (messages < 1) messages = 1;

// B ~=~ m / messages
1 OK 0.12s/1.00s 20 1/1
2 OK 0.56s/5.00s 18 1/1
3 OK 1.12s/8.00s 12 1/1
4 OK 1.16s/10.00s 20 1/1
5 OK 1.37s/10.00s 48 1/1
6 OK 2.66s/18.00s 20 1/1
7 OK 3.59s/22.00s 25 1/1
8 OK 2.24s/16.00s 50 1/1
9 OK 2.43s/12.00s 100 1/1
10 OK 1.30s/6.00s 100 1/1

Zawsze dzielę na 2P x P kratek, mój wzór oceniający czas działania to:
n*m*10ns/P + n*(P-1)*100ns + [P>1]*(0.2s+P*0.02s)