結果
| 問題 |
No.5014 セクスタプル (reactive)
|
| コンテスト | |
| ユーザー |
tomerun
|
| 提出日時 | 2022-12-29 19:35:29 |
| 言語 | Crystal (1.14.0) |
| 結果 |
AC
|
| 実行時間 | 26 ms / 2,000 ms |
| コード長 | 3,452 bytes |
| コンパイル時間 | 16,614 ms |
| 実行使用メモリ | 22,844 KB |
| スコア | 616,469,907 |
| 平均クエリ数 | 35.00 |
| 最終ジャッジ日時 | 2022-12-29 19:35:53 |
| 合計ジャッジ時間 | 23,425 ms |
|
ジャッジサーバーID (参考情報) |
judge11 / judge15 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
START_TIME = Time.utc.to_unix_ms
TL = 900
RND = Random.new(2)
macro debug(msg)
{% if flag?(:local) %}
STDERR.puts({{msg}})
{% end %}
end
macro debugf(format_string, *args)
{% if flag?(:local) %}
STDERR.printf({{format_string}}, {{*args}})
{% end %}
end
def crash(msg, caller_line = __LINE__)
puts "[ERROR] line #{caller_line}: #{msg}"
exit
end
macro assert(cond, msg = "", caller_line = __LINE__)
{% if flag?(:local) %}
if !({{cond}})
crash({{msg}}, {{caller_line}})
end
{% end %}
end
class Solver
def initialize
@row_cnt = Array(Array(Int32)).new(6) { Array.new(6, 0) }
@col_cnt = Array(Array(Int32)).new(6) { Array.new(6, 0) }
@row_sum = Array(Array(Int32)).new(6) { Array.new(6, 0) }
@col_sum = Array(Array(Int32)).new(6) { Array.new(6, 0) }
@row_miss = Array(Array(Bool)).new(6) { Array.new(6, false) }
@col_miss = Array(Array(Bool)).new(6) { Array.new(6, false) }
@used = Array(Array(Bool)).new(6) { Array.new(6, false) }
end
def solve
place = Array.new(36) { |i| i }
35.times do |i|
dices = read_line.split.map(&.to_i)
ds = Array.new(6) { |i| dices.count(i + 1) }
best_r = 0
best_c = 0
best_v = -10000000
6.times do |r|
6.times do |c|
next if @used[r][c]
v = 0
6.times do |e|
if ds[e] > 0
v += @row_miss[r][e] ? -ds[e] : ds[e] + @row_sum[r][e]
v += @col_miss[c][e] ? -ds[e] : ds[e] + @col_sum[c][e]
else
v += @row_miss[r][e] ? 0 : -@row_sum[r][e] - @row_cnt[r][e]
v += @col_miss[c][e] ? 0 : -@col_sum[c][e] - @col_cnt[r][e]
end
end
if v > best_v
best_r = r
best_c = c
best_v = v
end
end
end
@used[best_r][best_c] = true
6.times do |e|
if ds[e] > 0
@row_cnt[best_r][e] += 1
@row_sum[best_r][e] += ds[e]
@col_cnt[best_c][e] += 1
@col_sum[best_c][e] += ds[e]
else
@row_miss[best_r][e] = true
@col_miss[best_c][e] = true
end
end
puts "#{best_r + 1} #{best_c + 1}"
STDOUT.flush
end
{% if flag?(:local) %}
score = calc_score()
debug("final_score=#{score}")
{% end %}
end
def calc_score
mr = 0
mc = 0
6.times do |i|
6.times do |j|
if !@used[i][j]
mr = i
mc = j
end
end
end
calc_score_dfs(mr, mc, 0, Array.new(6, 0))
end
def calc_score_dfs(mr, mc, i, cnt)
ret = 0
if i == 6
6.times do |e|
if cnt[e] > 0
@row_cnt[mr][e] += 1
@row_sum[mr][e] += cnt[e]
@col_cnt[mc][e] += 1
@col_sum[mc][e] += cnt[e]
end
6.times do |j|
if @row_cnt[j][e] == 6
ret += @row_sum[j][e] - 3
end
if @col_cnt[j][e] == 6
ret += @col_sum[j][e] - 3
end
end
if cnt[e] > 0
@row_cnt[mr][e] -= 1
@row_sum[mr][e] -= cnt[e]
@col_cnt[mc][e] -= 1
@col_sum[mc][e] -= cnt[e]
end
end
debug(ret)
else
6.times do |e|
cnt[e] += 1
ret += calc_score_dfs(mr, mc, i + 1, cnt)
cnt[e] -= 1
end
end
return ret
end
end
def main
solver = Solver.new
solver.solve
end
main
tomerun