よく分からないからDPする。
memo[ n回スワップした ][ 今の状態 ]
const int N = 1000 + 1; map<string, double> memo[N]; class BallAndHats { public: int getHat(string hats, int numSwaps) { fill(memo, memo + N, map<string, double>()); memo[0][hats] = 1.0; for (int i = 0; i < numSwaps; ++i) { FOR (s, memo[i]) { string t = s->first; double cnt = 0; for (int a = 0; a + 1 < t.size(); ++a) { if (t[a] == 'o' || t[a + 1] == 'o') ++cnt; } for (int a = 0; a + 1 < t.size(); ++a) { if (t[a] == 'o' || t[a + 1] == 'o') { swap(t[a], t[a + 1]); memo[i + 1][t] += s->second / cnt; swap(t[a], t[a + 1]); } } } } double mx = 0; FOR (i, memo[numSwaps]) { mx = max(mx, i->second); } int mn = 4; FOR (i, memo[numSwaps]) { if (i->second == mx) { mn = min(mn, (int)i->first.find("o")); } } return mn; } };