TopCoder SRM 380 Div1 Medium CompilingDecksWithJokers
問題
n種類のカードがそれぞれcards[i]枚と、jokers枚のジョーカーがある。
これらを使って、
それぞれのカードが一種類一枚ずつ、あるいは、
それぞれのカードがどれか一種類以外一枚ずつと、ジョーカー一枚のデッキをできるだけ多く作りたい。
デッキは最大でいくつできるか求めよ。
制約条件
n≦50
cards[i]≦500000000
jokers≦500000000
方針
m枚のデッキが作れるかどうかについて二分探索。
m枚を決めると、同じデッキにはジョーカーは2枚以上入れられないので、
現時点で使えるジョーカーの枚数が決まる。
ジョーカーでないカードが使える場合はgreedyにそのカードを使えばよく、
ジョーカーを使ったら、ジョーカーを使える枚数から使った分だけ引く。
ソースコード
class CompilingDecksWithJokers { public: int maxCompleteDecks(vector <int> cards, int jokers) { ll lo=0,hi=1ll<<40,mid; int n=cards.size(); while(lo+1<hi){ mid=(lo+hi)/2; ll can=mid, use=0; rep(i,n){ if(cards[i]<mid){ can-=mid-cards[i]; use+=mid-cards[i]; } } if(can>=0&&use<=jokers)lo=mid; else hi=mid; } return lo; } };