結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
mudbdb
|
| 提出日時 | 2015-06-08 00:17:13 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 3,165 bytes |
| コンパイル時間 | 335 ms |
| コンパイル使用メモリ | 23,296 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 16:14:51 |
| 合計ジャッジ時間 | 1,530 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
コンパイルメッセージ
main.c: In function ‘main’:
main.c:20:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
20 | scanf("%d", &N);
| ^~~~~~~~~~~~~~~
main.c:21:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
21 | scanf("%d", &C);
| ^~~~~~~~~~~~~~~
main.c:22:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
22 | scanf("%d", &V);
| ^~~~~~~~~~~~~~~
main.c:24:23: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
24 | for (i=0; i<V; i++) scanf("%d", &(keiro[i].S));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:25:23: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
25 | for (i=0; i<V; i++) scanf("%d", &(keiro[i].T));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:26:23: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
26 | for (i=0; i<V; i++) scanf("%d", &(keiro[i].Y));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:27:23: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
27 | for (i=0; i<V; i++) scanf("%d", &(keiro[i].M));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>
#include <stdlib.h>
struct keiro {
int S; int T; int Y; int M;
};
int cmp(const void* a, const void* b)
{
struct keiro *c = (struct keiro*)a;
struct keiro *d = (struct keiro*)b;
if (c->S == d->S) {
return (c->T - d->T);
} else {
return (c->S - d->S);
}
}
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));
qsort(keiro, V, sizeof(struct keiro), cmp);
struct keiro_start {
int pos; int renge;
struct keiro *keiro;
};
struct keiro_start *keiro_start
= (struct keiro_start*)malloc(sizeof(struct keiro_start )*N);
for (i=0; i<N; i++) keiro_start[i].renge = 0;
for (i=0; i<V; i++) keiro_start[keiro[i].S - 1].renge ++;
keiro_start[0].pos = 0;
for (i=1; i<N; i++)
keiro_start[i].pos = keiro_start[i-1].pos + keiro_start[i-1].renge;
for (i=0; i<N; i++)
if (keiro_start[i].renge == 0) {
keiro_start[i].keiro = 0;
} else {
keiro_start[i].keiro = &(keiro[keiro_start[i].pos]);
}
int check_jikan;
int jikan = 0;
for (i=0; i<V; i++) jikan += keiro[i].M;
jikan++;
check_jikan = jikan;
struct mati {
int no; int Y; int M;
int keiro_i; int keiro_n;
struct keiro *keiro;
};
struct mati *mati = (struct mati*)malloc(sizeof(struct mati)*N);
struct mati *mati_p = mati;
mati_p->no = 1;
mati_p->Y = C;
mati_p->M = 0;
mati_p->keiro_i = 0;
mati_p->keiro_n = keiro_start[mati_p->no - 1].renge;
mati_p->keiro = keiro_start[mati_p->no - 1].keiro;
struct mati *mati_from = 0;
while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) {
mati_from = mati_p;
mati_p++;
mati_p->no = mati_from->keiro->T;
mati_p->Y = mati_from->Y - mati_from->keiro->Y;
mati_p->M = mati_from->M + mati_from->keiro->M;
mati_p->keiro_i = 0;
mati_p->keiro_n = keiro_start[mati_p->no - 1].renge;
mati_p->keiro = keiro_start[mati_p->no - 1].keiro;
}
while (1) {
if (mati_p->no == N) {
if (mati_p->Y >= 0) {
if (mati_p->M < jikan) {
jikan = mati_p->M;
}
}
}
while (1) {
if (mati_p == mati) {
goto END;
} else {
mati_p--;
mati_p->keiro_i++;
if (mati_p->keiro_i < mati_p->keiro_n) {
mati_p->keiro++;
break;
} else {
continue;
}
}
}
while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) {
mati_from = mati_p;
mati_p++;
mati_p->no = mati_from->keiro->T;
mati_p->Y = mati_from->Y - mati_from->keiro->Y;
mati_p->M = mati_from->M + mati_from->keiro->M;
mati_p->keiro_i = 0;
mati_p->keiro_n = keiro_start[mati_p->no - 1].renge;
mati_p->keiro = keiro_start[mati_p->no - 1].keiro;
}
}
END:
if (jikan == check_jikan) {
printf("%d\n", -1);
} else {
printf("%d\n", jikan);
}
return 0;
}
mudbdb