結果
問題 | No.5004 Room Assignment |
ユーザー |
![]() |
提出日時 | 2021-12-01 00:39:09 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 201 ms / 5,000 ms |
コード長 | 2,569 bytes |
コンパイル時間 | 18,651 ms |
実行使用メモリ | 22,368 KB |
スコア | 138,632,287 |
平均クエリ数 | 7636.82 |
最終ジャッジ日時 | 2021-12-01 00:39:52 |
合計ジャッジ時間 | 41,128 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge13 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
START_TIME = Time.utc.to_unix_msTL = 2900INF = 1 << 29T = 3600macro debug(msg){% if flag?(:local) %}STDERR.puts({{msg}}){% end %}endmacro debugf(format_string, *args){% if flag?(:local) %}STDERR.printf({{format_string}}, {{*args}}){% end %}endmaindef mainread_linesolver = Solver.new(START_TIME + TL)solver.solveendclass Roomgetter :ps, :ts, :is, :tsumdef initialize@ps = [] of Int32@ts = [] of Int32@is = [] of Int32@tsum = 0enddef add(s, t, id)@ps << s@ts.each { |et| @tsum += (et - t).abs }@ts << t@is << idenddef pop@ps.pop@is.popt = @ts.pop@ts.each { |et| @tsum -= (et - t).abs }enddef max@ps.maxenddef min@ps.minenddef size@ps.sizeenddef scorecase @ps.sizewhen 10when 2{(200 - (max - min) ** 2) - @tsum, 0}.maxwhen 3{3 * (200 - (max - min) ** 2) - @tsum, 0}.maxwhen 4{6 * (200 - (max - min) ** 2) - @tsum, 0}.maxelse-INFendendendclass Solverdef initialize(@timelimit : Int64)@turn = 0@num_p = 0@rooms = [] of Roomenddef solveT.times do |i|@turn = iss = read_line.split.map(&.to_i)n = ss.shiftmerge = [] of Tuple(Int32, Int32)ss.each do |s|@num_p += 1len = range(s)best_diff = 0best_room = nil@rooms.each do |r|next if r.size == 4next if r.min < s - len || s + len < r.maxdiff = -r.scorer.add(s, @turn, @num_p)diff += r.scorer.popif diff > best_diffbest_diff = diffbest_room = rendendif best_roombest_room.add(s, @turn, @num_p)merge << {best_room.is[0], @num_p}elser = Room.newr.add(s, @turn, @num_p)@rooms << rendendputs merge.sizemerge.each do |m|puts "#{m[0]} #{m[1]}"endSTDOUT.flushend# @rooms.each do |r|# debug("#{r.size} #{r.ps} #{r.ts} #{r.score}")# endscore = @rooms.map { |r| r.score }.sumdebug("score:#{score}")enddef range(s)d = (s - 50).absif d <= 0return 1elsif d <= 4return 2elsif d <= 12return 3elsif d <= 25return 4elsif d <= 35return 5elsif d <= 45return 6elsereturn 10endendend