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

// キュー
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>

// const int MAX_N = 100000;
const int STR_LEN = 10;

// キュー関連の定義
const int Max_Queue = 100000;

// キューの要素の構造体
typedef struct q_e {
  // 配列の要素No.
  int id;
  // プロセス名
  char process_name[STR_LEN];
  // プロセスの時間
  int process_time;
} queue_element;

queue_element ary_queue[Max_Queue];

// キューの情報の構造体
typedef struct q_i {
  int top;
  int tail;
  int count;
} queue_info;

queue_info que_info;

void create_queue(void);
int enqueue(queue_element element);
queue_element dequeue(void);

int main(void) {

  int N, cpu_time, total_time = 0;
  char str[STR_LEN];
  queue_element que_ele;

  // キューの初期化
  create_queue();

  scanf("%d %d", &N, &cpu_time);

  for (int i = 0; i < N; i++) {
    que_ele.id = i;

    scanf("%s", &str[0]);
    strcpy(&(que_ele.process_name[0]), &str[0]);

    scanf("%s", &str[0]);
    que_ele.process_time = atoi(str);

    // キューに挿入する
    enqueue(que_ele);
  }

  // cpuの時間を割り当てる
  while (que_info.count > 0) {
    // キューからポップする
    que_ele = dequeue();

    if (0 < que_ele.process_time && que_ele.process_time <= cpu_time) {
      total_time += que_ele.process_time;
      que_ele.process_time = 0;

      printf("%s %d\\n", que_ele.process_name, total_time);
    } else {
      total_time += cpu_time;
      que_ele.process_time -= cpu_time;

      enqueue(que_ele);
    }
  }

  return 0;
}

// キューを作成する関数
void create_queue(void) {
  int i;

  for (i = 0; i < Max_Queue; i++) {
    // キューの初期化
    ary_queue[i].id = 0;
    ary_queue[i].process_name[0] = '\\0';
    ary_queue[i].process_time = 0;
  }

  que_info.top = 0;
  que_info.tail = 0;
  que_info.count = 0;

  return;
}

// キューへプッシュする関数
int enqueue(queue_element element) {

  if (que_info.count > Max_Queue) {
    // サイズオーバー
    return INT_MIN;
  }

  if (que_info.tail == Max_Queue - 1) {
    // 配列をラウンド型にする
    que_info.tail = -1;
  }

  // キューに追加する
  ary_queue[que_info.tail++] = element;
  que_info.count++;

  return 0;
}

// キューからポップする関数
queue_element dequeue(void) {
  queue_element ret;

  if (que_info.count < 0) {
    // キューが空の時
    ret.id = INT_MIN;
  } else {
    if (que_info.top == Max_Queue - 1) {
      // 配列をラウンド型にする
      que_info.top = -1;
    }

    ret = ary_queue[que_info.top++];
  }

  que_info.count--;

  return ret;
}


Error: TLE

Fixed submission:

// キュー
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>

// const int MAX_N = 100000;
const int STR_LEN = 10;

// キュー関連の定義
const int Max_Queue = 100000;
int queue_pointer = 0;

typedef struct q_e {
  // 配列の要素No.
  int id;
  // プロセス名
  char process_name[STR_LEN];
  // プロセスの時間
  int process_time;
} queue_element;

queue_element ary_queue[Max_Queue];

void create_queue(void);
int enqueue(queue_element element);
queue_element dequeue(void);

int main(void) {

  int N, cpu_time, total_time = 0;
  char str[STR_LEN];
  queue_element que_ele;

  // キューの初期化
  create_queue();

  scanf("%d %d", &N, &cpu_time);

  for (int i = 0; i < N; i++) {
    que_ele.id = i;

    scanf("%s", &str[0]);
    strcpy(&(que_ele.process_name[0]), &str[0]);

    scanf("%s", &str[0]);
    que_ele.process_time = atoi(str);

    // キューに挿入する
    enqueue(que_ele);
  }

  // cpuの時間を割り当てる
  while (queue_pointer > 0) {
    // キューからポップする
    que_ele = dequeue();

    if (0 < que_ele.process_time && que_ele.process_time <= cpu_time) {
      total_time += que_ele.process_time;
      que_ele.process_time = 0;

      printf("%s %d\\n", que_ele.process_name, total_time);
    } else {
      total_time += cpu_time;
      que_ele.process_time -= cpu_time;

      enqueue(que_ele);
    }
  }

  return 0;
}

// キューを作成する関数
void create_queue(void) {
  int i;

  for (i = 0; i < Max_Queue; i++) {
    // キューの初期化
    ary_queue[i].id = 0;
    ary_queue[i].process_name[0] = '\\0';
    ary_queue[i].process_time = 0;
  }

  queue_pointer = 0;

  return;
}

// キューへプッシュする関数
int enqueue(queue_element element) {

  if (queue_pointer > Max_Queue) {
    // サイズオーバー
    return INT_MIN;
  }

  // キューに追加する
  ary_queue[queue_pointer++] = element;

  return 0;
}

// キューからポップする関数
queue_element dequeue(void) {
  queue_element ret;

  if (queue_pointer < 0) {
    // キューが空の時
    ret.id = INT_MIN;
  } else {
    ret = ary_queue[0];
  }

  for (int i = 0; i < queue_pointer; i++) {
    // 値をコピーしておく
    ary_queue[i] = ary_queue[i + 1];
  }

  queue_pointer--;

  return ret;
}