TopCoder SRM 427 Div1 Easy ShufflingMachine

問題

n枚のカードがある。
このカードを、次のような機械を使ってシャッフルする。

  • 機械を一度通すと、i番目のカードがshuffle[i]番目に来るよう並び替えられる
  • 1〜maxShuffleの整数を等確率で一つ選び、その回数だけデッキを機械に通す

その後、cardsReceived[]のカードをプレイヤーが受けとる。
いま、K枚のカードが欲しいとする。
最初のカードの並び順を自由に変えられるとき、目当てのカードを入手できる枚数の期待値を求めよ。

制約条件

n≦50
shuffle[i]は00〜n-1の整数の順列
cardsReceivedの各要素は0〜n-1の重複しない整数
cardsReceivedの要素はK以上

方針

初期状態でi番目にあるカードが、最後に配られる確率はそれぞれ求まる。
確率が高い順に貪欲にK枚のカードをとれば、期待値が求まる。

ソースコード

class ShufflingMachine {
  public:
  double stackDeck(vector <int> shuffle, int maxShuffles, vector <int> cardsReceived, int K) {
    int n=shuffle.size(),m=cardsReceived.size();
    vector<double> e(n);
    vi ord;
    rep(i,n)ord.pb(i);
    rep(i,maxShuffles){
      vi nxt(n);
      rep(j,n)nxt[shuffle[j]]=ord[j];
      rep(j,m)e[nxt[cardsReceived[j]]]+=1.0/maxShuffles;
      ord=nxt;
    }
    sort(all(e));
    double ans=0;
    rep(i,K)ans+=e[n-i-1];
    return ans;
  }
};