Submission #22286878
Source Code Expand
# frozen_string_literal: true
module Category
# メンバー個人の能力用メソッド
# 5つの能力がそれぞれボーダーをクリアしているかどうかで32通りに分ける。
# 一つもクリアできていない人が二進法で00000、パワーだけクリアしている人が二進法で00001、全てクリアしている人が二進法で11111
def categorize_thirty_two(border)
buffer_answer = 0
# 以下はself.each_with_index {|status, index| buffer_answer += 2**index if status >= border }と一緒
# 何度も回すメソッドなのでブロック使うとTLEしそう。whileで高速化
self_length = self.length
index_i = 0
while index_i <= self_length - 1
buffer_answer += 2**index_i if self[index_i] >= border
index_i += 1
end
buffer_answer
end
# 能力カテゴリ配列用のメソッド
# [false,true,true...]から3人まで選んで、5能力ともクリアできるチームを作れるか
def can_make_team
# クリア出来た候補者が0人なら考えるまでもなくクリア不可
return false if self.none?
# 一人で全能力クリアできる人がいるならクリアできるに決まっている
return true if self[-1]
# カテゴリ1の人と3の人がいる場合[nil,true,nil,true.....]の形なので[1,3.....]に書き直す
expanded_members = []
self.each_with_index {|member_exist, category| expanded_members << category if member_exist }
# メンバーが二人または3人の時は全員チーム選出。四人以上なら3人選抜。一人でクリアする場合は最初に早期リターンしている
# 二人または3人の組み合わせでビット演算で論理和して5桁とも塗りつぶせたらOK。
if expanded_members.size >= 3
expanded_members.combination(3).each {|category_of_members| return true if category_of_members.inject(:|) == 31 }
else
expanded_members.combination(2).each {|category_of_members| return true if category_of_members.inject(:|) == 31 }
end
# 組み合わせがなかったらNG
false
end
end
class Array
include Category
end
# 入力受付
MEMBERS_COUNT = gets.to_i
MEMBERS = Array.new(MEMBERS_COUNT) { gets.split.map(&:to_i) }
# 高すぎて絶対にクリアできないスコア
over_ng_limit = 1_000_000_001
# 低すぎて絶対にクリアできるスコア
under_ok_limit = 1
# 答えはこの中にあるので二部探索
until over_ng_limit - under_ok_limit == 1
mid = (over_ng_limit + under_ok_limit) / 2
categorized_members_count = Array.new(32)
# 能力32分類でそれぞれ人がいるか、いないか
MEMBERS.each do |member|
# 0から31まで分類
category = member.categorize_thirty_two(mid)
# 分類できたらカテゴリの人数を0人から一人にする。二人以上いても意味ないので二人以上にはしない
categorized_members_count[category] = true
# 一人で全能力クリアできてる人がいるなら中断。それ以上考えるまでもなくクリアできる。これはTLEしないならやらなくてもいい
break if categorized_members_count[-1]
end
# 全能力ボーダー未達の人が何人いても意味ないので無視。これはTLEしないならやらなくてもいい
categorized_members_count[0] = false
# クリアできるかどうか判定
if categorized_members_count.can_make_team
under_ok_limit = mid
else
over_ng_limit = mid
end
end
puts under_ok_limit
Submission Info
| Submission Time | |
|---|---|
| Task | C - MAD TEAM |
| User | HalMat |
| Language | Ruby (2.7.1) |
| Score | 400 |
| Code Size | 3632 Byte |
| Status | AC |
| Exec Time | 91 ms |
| Memory | 14652 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 400 / 400 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 01_sample.txt, 02_sample.txt, 03_sample.txt |
| All | 01_sample.txt, 02_sample.txt, 03_sample.txt, 04_small.txt, 05_small.txt, 06_small.txt, 07_small.txt, 08_small.txt, 09_random.txt, 10_random.txt, 11_random.txt, 12_random.txt, 13_random.txt, 14_random.txt, 15_random.txt, 16_random.txt, 17_random.txt, 18_random.txt, 19_random.txt, 20_random.txt, 21_random.txt, 22_random.txt, 23_random.txt, 24_max.txt, 25_max.txt, 26_max.txt, 27_max.txt, 28_max.txt, 29_killer.txt, 30_killer.txt, 31_killer.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 01_sample.txt | AC | 63 ms | 14188 KiB |
| 02_sample.txt | AC | 60 ms | 14372 KiB |
| 03_sample.txt | AC | 57 ms | 14208 KiB |
| 04_small.txt | AC | 60 ms | 14200 KiB |
| 05_small.txt | AC | 61 ms | 14212 KiB |
| 06_small.txt | AC | 59 ms | 14212 KiB |
| 07_small.txt | AC | 59 ms | 14292 KiB |
| 08_small.txt | AC | 59 ms | 14156 KiB |
| 09_random.txt | AC | 71 ms | 14100 KiB |
| 10_random.txt | AC | 60 ms | 14248 KiB |
| 11_random.txt | AC | 64 ms | 14252 KiB |
| 12_random.txt | AC | 61 ms | 14312 KiB |
| 13_random.txt | AC | 55 ms | 14196 KiB |
| 14_random.txt | AC | 60 ms | 14168 KiB |
| 15_random.txt | AC | 60 ms | 14004 KiB |
| 16_random.txt | AC | 61 ms | 14444 KiB |
| 17_random.txt | AC | 62 ms | 14112 KiB |
| 18_random.txt | AC | 66 ms | 14092 KiB |
| 19_random.txt | AC | 59 ms | 14380 KiB |
| 20_random.txt | AC | 62 ms | 14116 KiB |
| 21_random.txt | AC | 74 ms | 14200 KiB |
| 22_random.txt | AC | 70 ms | 14372 KiB |
| 23_random.txt | AC | 81 ms | 14396 KiB |
| 24_max.txt | AC | 87 ms | 14520 KiB |
| 25_max.txt | AC | 89 ms | 14364 KiB |
| 26_max.txt | AC | 90 ms | 14408 KiB |
| 27_max.txt | AC | 66 ms | 14652 KiB |
| 28_max.txt | AC | 85 ms | 14484 KiB |
| 29_killer.txt | AC | 88 ms | 14340 KiB |
| 30_killer.txt | AC | 91 ms | 14496 KiB |
| 31_killer.txt | AC | 91 ms | 14340 KiB |