ymduu+2

初心を忘れないのでツンデレとPSPが今でも好き、技術メモとか制作物とかそういうの

ARC068 D Card Eater

所見

解説の方針頭良すぎワロタ

問題概要

N枚のカードに整数が書かれている。その中から任意の3枚を取り、最大の数と最小の数を食べ、カードの集合から同じ数がなくなることを目指す。最大で何枚残せるかを求めよ。

取った方針

同じ数が3枚以上あるとき、その3枚を選ぶことで同じ数を2枚減らすことができる。これを繰り返すと、M=奇数枚ある数はM/2回の操作のあと1枚に、L=偶数枚ある数はL/2-1回の操作のあと2枚になる。
同じ数が2枚あるとき、その2枚ともう一枚を選ぶことで1枚にすることができる。この時、もう一枚も"同じ数のカードが2枚ある数"を選ぶことで、同時に解決することができる。
よって、取る枚数は、2*(M/2 + L/2 - 1 + ceil(偶数枚ある数/2)) で求まる。

正しい方針(解説の方針)

この手順は、ほぼ任意のカードを捨てることができる。
Nは奇数である。
ここで、山の中にk種類の数があるとして、kが奇数ならば取り除かれるべきカードは偶数枚(奇数-奇数)あり、偶数ならば奇数枚ある。
よって、kが奇数ならば取り除かれるカードのみを取り除けるのでk、偶数ならば取り除かなくてもよいカードを1枚取り除かなくてはならないのでk-1となる。
コンテスト中にこれを思いついても本当に任意のカードを捨てられるかで悩んで選べなさそうな気がする。

得られた知見

・制約が与えられたとき、その制約は本当に考える必要があるかを考える(実はその制約がなくても同じ意味の操作、問題にならないか?)
・操作が与えられ、最適解を求めるとき、その操作で得られるもっとも効率のよい結果は何かを考える(貪欲をする)

解くのに必要な要素

・貪欲

周辺調査によって得られた知見

・ソート解法もある
・順番に意味がない問題の場合はソートを考えるとうまくいくこともある