SRM500 div1 easy
まずソートして1番票をもらう人をもとめる。(ソースではNmost人としている)
それから"vulnerable"な人の人数が一人になるか変わらなくなるまで
シュミレーションする。
#include <algorithm> #include <vector> using namespace std; class MafiaGame { public: double probabilityToLose(int N, vector<int> decisions) { vector<int> v(N,0); for(int i=0;i<(int)decisions.size();i++) v[decisions[i]]++; sort(v.begin(),v.end()); reverse(v.begin(),v.end()); int most=v[0],Nmost=0; for(int i=0;i<N;i++) if(v[i]==most) Nmost++; if(most==1) return 0.0; if(Nmost==1) return 1.0; int preMost=Nmost; while(1) { int m=preMost; int left=N-m*most; if(left%m==0) return 0.0; else if(left%m==1) return 1.0/(double)Nmost; else m=left%m; preMost=m; } } };