結果
| 問題 |
No.496 ワープクリスタル (給料日前編)
|
| コンテスト | |
| ユーザー |
mban
|
| 提出日時 | 2017-03-28 22:38:54 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 26 ms / 2,000 ms |
| コード長 | 3,516 bytes |
| コンパイル時間 | 3,925 ms |
| コンパイル使用メモリ | 110,928 KB |
| 実行使用メモリ | 25,960 KB |
| 最終ジャッジ日時 | 2024-07-06 13:31:23 |
| 合計ジャッジ時間 | 2,565 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 23 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.IO;
class Program
{
static void Main()
{
new Magatro().Solve();
}
}
public class Scanner
{
private StreamReader Sr;
private string[] S;
private int Index;
private const char Separator = ' ';
public Scanner(Stream source)
{
Index = 0;
S = new string[0];
Sr = new StreamReader(source);
}
private string[] Line()
{
return Sr.ReadLine().Split(Separator);
}
public string Next()
{
string result;
if (Index >= S.Length)
{
S = Line();
Index = 0;
}
result = S[Index];
Index++;
return result;
}
public int NextInt()
{
return int.Parse(Next());
}
public double NextDouble()
{
return double.Parse(Next());
}
public long NextLong()
{
return long.Parse(Next());
}
public decimal NextDecimal()
{
return decimal.Parse(Next());
}
public string[] StringArray(int index = 0)
{
Next();
Index = S.Length;
return S.Skip(index).ToArray();
}
public int[] IntArray(int index = 0)
{
return StringArray(index).Select(int.Parse).ToArray();
}
public long[] LongArray(int index = 0)
{
return StringArray(index).Select(long.Parse).ToArray();
}
public bool EndOfStream
{
get { return Sr.EndOfStream; }
}
}
public class Magatro
{
private int Gx, Gy, N, F;
private int[] x, y, c;
private int[,] Cost;
private void Scan()
{
var cin = new Scanner(Console.OpenStandardInput());
Gx = cin.NextInt();
Gy = cin.NextInt();
N = cin.NextInt();
F = cin.NextInt();
x = new int[N];
y = new int[N];
c = new int[N];
for (int i = 0; i < N; i++)
{
x[i] = cin.NextInt();
y[i] = cin.NextInt();
c[i] = cin.NextInt();
}
}
public void Solve()
{
Scan();
Cost = new int[Gx + 1, Gy + 1];
for (int i = 0; i <= Gx; i++)
{
for (int j = 0; j <= Gy; j++)
{
Cost[i, j] = int.MaxValue;
}
}
Cost[0, 0] = 0;
for (int k = 0; k < N; k++)
{
for (int i = Gx; i >= 0; i--)
{
for (int j = Gy; j >= 0; j--)
{
if (Cost[i, j] == int.MaxValue)
{
continue;
}
int nextX = i + x[k];
int nextY = j + y[k];
if (nextX > Gx || nextY > Gy)
{
continue;
}
Cost[nextX, nextY] = Math.Min(Cost[nextX, nextY], Cost[i, j] + c[k]);
}
}
}
int anser = int.MaxValue;
for (int i = 0; i <= Gx; i++)
{
for (int j = 0; j <= Gy; j++)
{
if (Cost[i, j] == int.MaxValue)
{
continue;
}
anser = Math.Min(anser, Walk(i, j) + Cost[i, j]);
}
}
Console.WriteLine(anser);
}
private int Walk(int x, int y)
{
int dist = (Gx - x) + (Gy - y);
return F * dist;
}
}
mban