Problem Statement |
|||||||||||||
N friends (numbered from 0 to N-1) play a game called Mafia. The exact rules of the game are not important for this problem. What's important is that at some point in the game they will need to choose one player who will
lose and leave the game. It is known that some players have a definite opinion on who should lose. Their opinions are given in the vector <int> decisions, where each element corresponds to a single opinion and is the number of a player who should lose according to that opinion. All opinions in decisions belong to different players. If decisions contains less than N elements, then all other players do not have a definite opinion on who should lose. In order to determine who will lose, one or more rounds of voting will be conducted. In each round, there's a set of players for whom the players are allowed to vote. The players in this set are called "vulnerable". It's impossible to vote for players not in this set. Before the first round of voting, all N players are included in this set. All N players will vote in each round. The voting is held according to the following scheme:
|
|||||||||||||
Definition |
|||||||||||||
|
|||||||||||||
Notes |
|||||||||||||
- | The exact numbers of people to whom the opinions in decisions belong are not relevant in this problem. | ||||||||||||
- | It is possible that a player will decide to vote against himself (see example 0). It is also possible that a player will have to vote against himself (if he is one of "vulnerable" players who have the smallest number of votes in the current round). | ||||||||||||
- | The returned value must have an absolute or relative error less than 1e-9. | ||||||||||||
Constraints |
|||||||||||||
- | N will be between 2 and 500, inclusive. | ||||||||||||
- | decisions will contain between 1 and min(N, 50) elements, inclusive. | ||||||||||||
- | Each element of decisions will be between 0 and N-1, inclusive. | ||||||||||||
Examples |
|||||||||||||
0) | |||||||||||||
|
|||||||||||||
1) | |||||||||||||
|
|||||||||||||
2) | |||||||||||||
|
|||||||||||||
3) | |||||||||||||
|
【題解】
官網說的很詳細。
對於最初局面有兩種情況:
1、每個人都有有且僅有一票,則肯定無解。
2、有些人得到了兩票或者更多,則那些最初得票最多的成爲輸家的概率更大。(顯而易見)
所以答案=1/(最初的票最多的人的數量)
【代碼】
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class MafiaGame
{
public:
double probabilityToLose(int, vector <int>);
};
double MafiaGame::probabilityToLose(int n, vector <int> decisions)
{
int i,Max,sum,c;
int a[505]={0};
for (i=0;i<decisions.size();i++)
a[decisions[i]]++;
Max=0;sum=0;
for (i=0;i<n;i++)
if (a[i]>Max)
{
sum=1;
Max=a[i];
}
else if (a[i]==Max)
{
sum++;
}
if (sum==decisions.size()) return 0;
c=sum;
while (1)
{
if (c==0) return 0;
if (c==1) return 1.0/sum;
c=n%c;
}
}
//Powered by [KawigiEdit] 2.0!