結果
問題 | No.1 道のショートカット |
ユーザー | shi-mo |
提出日時 | 2016-03-22 00:16:17 |
言語 | Ruby (3.3.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,412 bytes |
コンパイル時間 | 80 ms |
コンパイル使用メモリ | 7,296 KB |
実行使用メモリ | 12,544 KB |
最終ジャッジ日時 | 2024-07-08 04:25:17 |
合計ジャッジ時間 | 6,013 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | RE | - |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | RE | - |
testcase_28 | RE | - |
testcase_29 | RE | - |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | RE | - |
testcase_34 | RE | - |
testcase_35 | RE | - |
testcase_36 | RE | - |
testcase_37 | RE | - |
testcase_38 | RE | - |
testcase_39 | RE | - |
testcase_40 | RE | - |
testcase_41 | RE | - |
testcase_42 | RE | - |
testcase_43 | RE | - |
コンパイルメッセージ
Syntax OK
ソースコード
#!ruby require 'scanf' class ShortcutProblem Way = Struct.new('Way', :start, :terminal, :credits, :time) def self.load(io) num_cities = io.gets.scanf('%d\n')[0] credits = io.gets.scanf('%d\n')[0] num_ways = io.gets.scanf('%d\n')[0] ways = load_ways_from(io, num_ways) new(num_cities, credits, num_ways, ways) end def self.load_ways_from(io, num_ways) starts = parse_int_array_from(io.gets) terminals = parse_int_array_from(io.gets) credits = parse_int_array_from(io.gets) times = parse_int_array_from(io.gets) ways = [] num_ways.times do |i| ways << Way.new(starts[i], terminals[i], credits[i], times[i]) end ways end def self.parse_int_array_from(line) line.chomp.split(/ /).map(&:to_i) end def initialize(num_cities, credits, num_ways, ways) @num_cities = num_cities @credits = credits @num_ways = num_ways @way_table = create_way_table(ways) # elements must be sorted by Way#time end attr_reader :num_cities, :credits, :num_ways NO_SOLUTION = -1 def solve 2.upto(num_cities) do |i| connect_ways_to(i) end ways_satisfy_condition = \ @way_table[1][num_cities].select{|way| way.credits <= credits } return NO_SOLUTION if ways_satisfy_condition.empty? ways_satisfy_condition.first.time end def create_way_table(ways) table = Array.new(num_cities+1){ Array.new(num_cities+1){ [] } } ways.each do |way| table_entry = table[way.start][way.terminal] table_entry << way end table end def connect_ways_to(terminal) if 2 == terminal sort_table_entry(@way_table[1][2]) return end connected_ways = @way_table[1][terminal] 2.upto(terminal-1) do |pivot| ways_before_pivot = @way_table[1][pivot] ways_after_pivot = @way_table[pivot][terminal] ways_before_pivot.product(ways_after_pivot) do |way1, way2| connected_ways << connect_ways(1, terminal, way1, way2) end end sort_table_entry(connected_ways) end def sort_table_entry(entry) entry.sort_by!{|way| way.time } end def connect_ways(start, terminal, way1, way2) credits = way1.credits + way2.credits time = way1.time + way2.time Way.new(start, terminal, credits, time) end end def main problem = ShortcutProblem.load(STDIN) puts problem.solve end main