1694 An Old Stone Game
問題概要
ノード数200以下の木を使った次のようなゲームがある。
- 最初にK個の石をかごに入れる。
- かごの石は好きな葉に置くことができる。
- 子全てに石のおかれたノードがあるとき、子の全ての石をかごに戻し、そのノードに石を置くことができる。
- 根に石が置かれると勝ちである。
木が与えられたとき、最初にかごに入れる石の数Kのゲームクリアに必要な最小値を求めよ。
解法
あるノードに石を置くのに必要なコストは次のような考え方をすればよい。
子1,2,...にそれぞれ石を置くのに必要なコストをa[i]とすると、a[i]の大きい順に石を置いていくのが最適。
子のi個まで石を置き終えたあとで、i+1番目の子に石を置くのに必要なコストはi+a[i+1].
よってそのノードに置く石の数は、これらの最大値となる。
ソースコード
int n; vector<vi> e; int rec(int c) { if(e[c].empty())return 1; int m=0,a[200]; fr(i,e[c])a[m++]=rec(*i); sort(a,a+m,greater<int>()); rep(i,m)a[i]+=i; sort(a,a+m,greater<int>()); return a[0]; } int main() { int cs; scanf("%d",&cs); rep(CS,cs) { scanf("%d",&n); e.clear(); e.resize(n); rep(i,n) { int a,b,c; scanf("%d%d",&a,&b); rep(j,b)scanf("%d",&c),e[a-1].pb(c-1); } printf("%d\n",rec(0)); } return 0; }