TopCoder TCO 2018 Round 1A 500 (思维)

Posted 小坏蛋_千千

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TopCoder TCO 2018 Round 1A 500 (思维)相关的知识,希望对你有一定的参考价值。

Problem Statement

The Resistance is a multiplayer board game. During the game each player belongs into one of two groups: some are resistance members, others are spies. In this problem there are P players, and exactly S of them are spies. The players are numbered 0 through P-1.

The game is played in rounds. In each round of the game a subset of all players goes on a mission. Each player who goes on the mission casts a secret vote on whether they want it to succeed or to fail. Resistance members always vote for the mission to succeed, and spies may cast either vote. (Sometimes a spy will vote for a mission to succeed in order to gain trust of the other players.) If at least one player on a mission voted for it to fail, the mission fails. If everybody voted for the mission to succeed, it succeeds.

You are given the ints P and S. You are also given the vector <string> missions: data on all the missions that already took place. Each mission is described by a string. The first character of that string is ‘F’ for a failed mission or ‘S’ for a successful one. The next P characters describe which players went on the mission: for each valid i, character (i+1) is ‘1’ if player i went on the misson and ‘0’ otherwise.

Verify whether the mission history is valid. If there is no assignment of roles (spies / resistance members) to players that would be consistent with the given mission history, return an empty vector <double>.

If the mission history is valid, assume that each of the matching assignments of roles to players is equally likely. Return a vector <double> containing P elements. For each i, the i-th element of the return value should be the probability that player i is a spy, given the above assumption.

 

Examples

4
1
"S0110",
 "F1100",
 "S0011"
Returns: 0.5, 0.5, 0.0, 0.0

 

题意

在 Resistance 这款游戏中,存在 resistance members 与 spies 这两种玩家,已知 resistance members 一定想让任务成功,而 spies 则不一定,所有失败的任务一定是因为 spies 的支持所导致的,求每个人是 spies 的概率。

 

思路

因为总人数 P 很小,于是我们枚举所有可能性(必须包含 S 个间谍),我们首先判断当前所选择的方案是否合法,因为这 S 个间谍的支持导致出现了失败的任务,也就是说若某个失败的任务没有得到任何当前方案里的间谍支持,则该方案是不合法的。

对于每一个合法的方案,这 S 个人成为间谍的概率是等可能的,因此统计他们所出现的次数,最终将 S×1.0 S × 1.0 的概率值按权分配到每一个人身上即他们是间谍的概率。

 

AC 代码

#include <bits/stdc++.h>
#define IO                       \\
    ios::sync_with_stdio(false); \\
    cin.tie(0);                  \\
    cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 10;

class Resistance 
public:
    bitset<32> sk;
    bool judgeX(int P, vector<string> &missions) 
        unordered_set<int> vis;
        for (int i = 0; i < P; i++) 
            if (sk[i]) 
                for (int k = 0; k < (int)missions.size(); k++) 
                    if (missions[k][i + 1] == '1') 
                        vis.insert(k);
                    
                
            
        
        for (int i = 0; i < (int)missions.size(); i++) 
            if (missions[i][0] == 'F') 
                if (!vis.count(i))
                    return false;
            
        
        return true;
    

    vector<double> spyProbability(int P, int S, vector<string> missions) 
        int num[20] = 0;
        for (int i = 0; i < (1 << P); i++) 
            sk = i;
            if (sk.count() != S || !judgeX(P, missions))
                continue;
            for (int i = 0; i < P; i++) 
                if (sk[i]) 
                    num[i]++;
                
            
        
        int cut = 0;
        for (int i = 0; i < P; i++) 
            cut += num[i];
        
        if (cut == 0)
            return vector<double>();
        double mis = S * 1.0 / cut;
        vector<double> ans;
        for (int i = 0; i < P; i++) 
            ans.push_back(num[i] * mis);
        
        return ans;
    

;

以上是关于TopCoder TCO 2018 Round 1A 500 (思维)的主要内容,如果未能解决你的问题,请参考以下文章

2018 TCO Algorithm Round 1B

TCO 11 muddy round

思维题TCO14 Round 2C InverseRMQ

TCO14 1B L3: EagleInZoo, dp,tree

TCO 2015 2D

TCO