#include int weight[10] = { 20, 20, 20, 50, 20, 20, 20 }; double time[10]; double ntime[10]; #define MIN_S 1 #define MAX_S 10 #define SLICE(x) (MAX_S / (double)weight[x]) #define MINSLICE(x) (MIN_S / (double)weight[x]) int main(void) { int i, j, l, w; double s, t, min, max; for (i = 0; i < 10; i++) ntime[i] = time[i] = 0; j = 0; l = 0; s = 0; while (1) { j = l ? 0 : 1; for (i = 0; i < 10; i++) { if (!weight[i] || i == l) continue; if (ntime[i] + MINSLICE(i) < ntime[j] + MINSLICE(j)) j = i; } if (ntime[l] >= ntime[j] + SLICE(j) || (ntime[l] >= ntime[j] && ntime[l] >= s + SLICE(l))) { l = j; s = ntime[l]; } time[l] += MIN_S; ntime[l] += MIN_S / (double)weight[l]; printf("%u", l); for (i = 0, w = 0, t = 0; i < 10; i++) { if (!weight[i]) continue; w += weight[i]; t += ntime[i] * weight[i]; printf("\t%3u/%u:%5g/%-7g", i, weight[i], time[i], ntime[i]); } t /= w; min = max = t; for (i = 0; i < 10; i++) { if (!weight[i]) continue; if (ntime[i] < min) min = ntime[i]; if (ntime[i] > max) max = ntime[i]; } printf("\t| %g (%g)\n", t, max - min); } }