結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-07-06 18:41:39 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,335 bytes |
| コンパイル時間 | 485 ms |
| コンパイル使用メモリ | 61,948 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-08 05:03:34 |
| 合計ジャッジ時間 | 1,565 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 3 |
| other | AC * 4 WA * 36 |
ソースコード
#include <iostream>
#include <climits>
#include <queue>
#include <vector>
#define REP(i,a,b) for(int i=(a); i<(b); i++)
#define p_int pair<int, int>
using namespace std;
int main(){
// 街の数、コスト上限、道の数
int city_n, c_max, load_n;
cin >> city_n >> c_max >> load_n;
// 始点、終点、コスト、時間
int s[load_n], t[load_n], c[load_n], time[load_n];
REP(i, 0, load_n) cin >> s[i];
REP(i, 0, load_n) cin >> t[i];
REP(i, 0, load_n) cin >> c[i];
REP(i, 0, load_n) cin >> time[i];
// 現在地を縦軸、使った費用を横軸に取ってDP
int dp[city_n + 1][c_max + 1];
REP(i, 0, city_n + 1){
REP(j, 0, c_max + 1){
dp[i][j] = INT_MAX;
}
}
dp[1][0] = 0;
REP(i, 1, city_n) {
REP(j, 0, c_max) {
// iに至る辺があるか調べる
REP(k, 0, load_n){
if (i == t[k] && j - c[k] >= 0){
// s[k] < t[k] (=i) なのでOK
dp[i][j] = min(dp[i][j], dp[s[k]][j - c[k]] + time[k]);
}
}
}
}
// dp[i][city_n]における最小値を返す
int ans = INT_MAX;
REP(i, 0, c_max + 1){
ans = min(ans, dp[city_n][i]);
}
if (ans == INT_MAX) cout << -1 << endl;
else cout << ans << endl;
return 0;
}