Problem p00192 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

const int INF = 1 << 28;

int m, n;
int t[100];
int out[100];

void solve() {
  vector<int> res;
  stack<int> st[10];
  queue<int> que;

  fill(out, out + 100, INF);

  int time = 0;
  while (res.size() < n) {
    //		printf("%d\\n", time);
    //		for (int i = 0; i < 10000; i++) printf("");

    //		for (int i = 0; i < n; i++) printf("%d ", out[i]);
    //		puts("");

    for (int i = 0; i < m; i++) {
      while (st[i].size() && out[st[i].top()] <= time) {
        int a = st[i].top();
        st[i].pop();
        out[a] = INF;
        res.push_back(a);
        //					printf("out %d\\n", a);
      }
    }

    if (time % 10 == 0 && time / 10 < n) {
      que.push(time / 10);
      //				printf("wait %d\\n", time / 10);
    }

    while (que.size()) {
      int a = que.front();
      bool f = false;
      int ot = time + t[a];

      for (int i = 0; i < m; i++) {
        if (st[i].size())
          continue;
        st[i].push(a);
        out[a] = ot;
        que.pop();
        f = true;
        //					printf("in %d\\n", a);
        break;
      }
      if (f)
        continue;

      int mini = -1;
      for (int i = 0; i < m; i++) {
        if (st[i].size() == 2)
          continue;
        if (out[st[i].top()] < ot)
          continue;
        if (mini == -1) {
          mini = i;
        } else if (out[st[mini].top()] > out[st[i].top()]) {
          mini = i;
        }
      }
      if (~mini) {
        st[mini].push(a);
        out[a] = ot;
        que.pop();
        //					printf("in %d\\n", a);
        continue;
      }

      mini = -1;
      for (int i = 0; i < m; i++) {
        if (st[i].size() == 2)
          continue;
        if (mini == -1) {
          mini = i;
        } else if (out[st[mini].top()] < out[st[i].top()]) {
          mini = i;
        }
      }
      if (~mini) {
        st[mini].push(a);
        out[a] = ot;
        que.pop();
        //					printf("in %d\\n", a);
        continue;
      }

      break;
    }

    time++;
  }

  for (int i = 0; i < res.size(); i++) {
    if (i)
      printf(" ");
    printf("%d", ++res[i]);
  }
  puts("");
}

int main() {
  while (scanf("%d %d", &m, &n), m) {
    for (int i = 0; i < n; i++) {
      scanf("%d", &t[i]);
    }
    solve();
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

const int INF = 1 << 28;

int m, n;
int t[100];
int out[100];

void solve() {
  vector<int> res;
  stack<int> st[10];
  queue<int> que;

  fill(out, out + 100, INF);

  int time = 0;
  while (res.size() < n) {
    //		printf("%d\\n", time);
    //		for (int i = 0; i < 10000; i++) printf("");

    //		for (int i = 0; i < n; i++) printf("%d ", out[i]);
    //		puts("");

    for (int i = 0; i < m; i++) {
      while (st[i].size() && out[st[i].top()] <= time) {
        int a = st[i].top();
        st[i].pop();
        out[a] = INF;
        res.push_back(a);
        //					printf("out %d\\n", a);
      }
    }

    if (time % 10 == 0 && time / 10 < n) {
      que.push(time / 10);
      //				printf("wait %d\\n", time / 10);
    }

    while (que.size()) {
      int a = que.front();
      bool f = false;
      int ot = time + t[a];

      for (int i = 0; i < m; i++) {
        if (st[i].size())
          continue;
        st[i].push(a);
        out[a] = ot;
        que.pop();
        f = true;
        //					printf("in %d\\n", a);
        break;
      }
      if (f)
        continue;

      int mini = -1;
      for (int i = 0; i < m; i++) {
        if (st[i].size() == 2)
          continue;
        if (out[st[i].top()] < ot)
          continue;
        if (mini == -1) {
          mini = i;
        } else if (out[st[mini].top()] > out[st[i].top()]) {
          mini = i;
        }
      }
      if (~mini) {
        st[mini].push(a);
        out[a] = ot;
        que.pop();
        //				printf("in %d\\n", a);
        continue;
      }

      mini = -1;
      for (int i = 0; i < m; i++) {
        if (st[i].size() == 2)
          continue;
        if (mini == -1) {
          mini = i;
        } else if (out[st[mini].top()] < out[st[i].top()]) {
          mini = i;
        }
      }
      if (~mini) {
        st[mini].push(a);
        out[a] = ot;
        que.pop();
        //				printf("in %d\\n", a);
        continue;
      }
    }

    time++;
  }

  for (int i = 0; i < res.size(); i++) {
    if (i)
      printf(" ");
    printf("%d", ++res[i]);
  }
  puts("");
}

int main() {
  while (scanf("%d %d", &m, &n), m) {
    for (int i = 0; i < n; i++) {
      scanf("%d", &t[i]);
    }
    solve();
  }
  return 0;
}