結果

問題 No.1 道のショートカット
ユーザー mudbdbmudbdb
提出日時 2015-06-06 23:47:12
言語 C90
(gcc 11.4.0)
結果
TLE  
実行時間 -
コード長 2,442 bytes
コンパイル時間 1,015 ms
コンパイル使用メモリ 26,240 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-22 12:19:24
合計ジャッジ時間 7,170 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 0 ms
4,380 KB
testcase_02 AC 0 ms
4,376 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 0 ms
4,376 KB
testcase_07 AC 1 ms
4,376 KB
testcase_08 TLE -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <stdio.h>
#include <stdlib.h>
struct mati {
  int no; int Y; int M;
};
struct keiro {
  int S; int T; int Y; int M;
};
int main()
{
  int N, C, V, i;
  struct keiro *keiro;
  scanf("%d", &N);
  scanf("%d", &C);
  scanf("%d", &V);
  keiro = (struct keiro*)malloc(sizeof(struct keiro)*V);
  for (i=0; i<V; i++) scanf("%d", &(keiro[i].S));
  for (i=0; i<V; i++) scanf("%d", &(keiro[i].T));
  for (i=0; i<V; i++) scanf("%d", &(keiro[i].Y));
  for (i=0; i<V; i++) scanf("%d", &(keiro[i].M));

  int mati_top = -1;
  struct mati *mati = (struct mati*)malloc(sizeof(struct mati)*N);
  int work_top = -1;
  struct keiro *work = (struct keiro*)malloc(sizeof(struct keiro)*V);
  int check;
  int check_jikan;

  int jikan = 0;
  for (i=0; i<V; i++) jikan += keiro[i].M;
  jikan++;
  check_jikan = jikan;

  mati_top++;
  mati[mati_top].no = 1;
  mati[mati_top].Y = C;
  mati[mati_top].M = 0;

  check = 0;
  for (i=0; i<V; i++) {
    if (mati[mati_top].no == keiro[i].S) {
      work_top++;
      work[work_top] = keiro[i];
      check++;
    }
  }
  if (check == 0) {
    printf("%d\n", -1);
    return 0;
  }

  while (1) {
    mati_top++;
    mati[mati_top].no = work[work_top].T;
    mati[mati_top].Y = mati[mati_top-1].Y - work[work_top].Y;
    mati[mati_top].M = mati[mati_top-1].M + work[work_top].M;

    if (mati[mati_top].no == N) {
      if (mati[mati_top].Y >= 0) {
        if (mati[mati_top].M < jikan) {
          jikan = mati[mati_top].M;
        }
      }

      mati_top--;
      while (1) {
        work_top--;
        if (work_top == -1) {
          break;
        } else {
          if (work[work_top].S < work[work_top+1].S) {
            mati_top--;
            continue;
          } else {
            break;
          }
        }
      }
    } else {
      check = 0;
      for (i=0; i<V; i++) {
        if (mati[mati_top].no == keiro[i].S) {
          work_top++;
          work[work_top] = keiro[i];
          check++;
        }
      }
      if (check == 0) {
        while (1) {
          work_top--;
          if (work_top == -1) {
            break;
          } else {
            if (work[work_top].S < work[work_top+1].S) {
              mati_top--;
              continue;
            } else {
              break;
            }
          }
        }
      }
    }
    if (work_top == -1) break;
  }
  if (jikan == check_jikan) {
    printf("%d\n", -1);
  } else {
    printf("%d\n", jikan);
  }
  return 0;
}
0