计蒜客 腾讯狼人杀 简单 状压+枚举
2017-05-27 23:27
369 查看
不久前,腾讯推出了一款改进后的狼人杀游戏。如下是这款游戏的背景和详细规则:
很久很久以前,在莱茵河畔一座岸壁陡峭的山顶上,有一个名叫“杜斯特瓦德”的小村庄。不久前,这个小村庄每晚都会受到狼人的侵袭。每个夜晚,狼人都会在村中进行抢劫,并且会有一个村民成为这群狼人的牺牲品。然而村民们不会坐以待毙,他们试图在白天找到这些狼人并处决他们。
作为杜斯特瓦德村的长老,你需要组织村民来对抗狼人,村民包括许多有超能力的人,比如预言家可以检验一个人是否是隐藏在神民阵营的狼人、猎人可以开枪打死一名狼人。因为狼人白天隐藏的非常深,仅仅单人的行动往往不能限制狼人的行动,多人行动将会起到更好的效果。比如预言家和猎人一起行动将被检验出是狼人的“村民”直接打死,村庄将回归和平。
我们将这样的一对人所产生的战斗力记作 ww,值得注意的是,一个人可以被多次计算,比如预言家可以先后和猎人、女巫(或其他人)组合,即如果预言家和猎人的战斗力为 ww,预言家和女巫的战斗力为 w’w
′
,这三个人的战斗力之和为 w+w’w+w
′
。
不过因为经过“新月”事件,村庄贫苦破败,你需要支付一定的金额给各个被你聘用的村民,假设你邀请了k个村民,则需要 k(2n-k)k(2n−k) 块钱(nn 为村民总数),你的资金也不太足够,所以你希望资金的利用率最大,资金的利用率定义为:((被选择的人战斗力之和 // 你支付的资金))。除此之外有些人基于他们的重要性,是必须被选择的。你必须邀请他们来参加战斗(保证至少一人)。
输入格式
第一行包括两个整数 n,mn,m 分别表示 nn 个村民和有 mm 对人之间有战斗力。
接下来 mm 行,每行有三个整数 u_i,v_i,w_iu
i
,v
i
,w
i
(1 \le u_i,v_i \le n,(1≤u
i
,v
i
≤n, 1 \le w_i \le 100,1≤w
i
≤100, u_i \neq v_i)u
i
≠v
i
) 表示 这对人可以产生的战斗力 w_iw
i
。
接下来 nn 个数,对于第 ii 个数,00 表示第 ii 个人可参加战斗,11 表示第 ii 个人必须参加战斗(保证至少一个 11)。
对于简单版本,1 \leq n \leq 20,1≤n≤20, 0 \le m \le n(n-1)/20≤m≤n(n−1)/2;
对于中等版本,1 \leq n \leq 300,1≤n≤300, 0 \le m \le \min(1000, n(n-1)/2)0≤m≤min(1000,n(n−1)/2);
对于困难版本,1 \leq n \leq 400,1≤n≤400, 0 \le m \le \min(10000, n(n-1)/2)0≤m≤min(10000,n(n−1)/2)。
输出格式
对于简单版本和中等版本,输出一个 44 位小数,表示资金利用率的最大值,结果四舍五入;
对于困难版本,输出一个 66 位小数,表示资金利用率的最大值,结果四舍五入。
很久很久以前,在莱茵河畔一座岸壁陡峭的山顶上,有一个名叫“杜斯特瓦德”的小村庄。不久前,这个小村庄每晚都会受到狼人的侵袭。每个夜晚,狼人都会在村中进行抢劫,并且会有一个村民成为这群狼人的牺牲品。然而村民们不会坐以待毙,他们试图在白天找到这些狼人并处决他们。
作为杜斯特瓦德村的长老,你需要组织村民来对抗狼人,村民包括许多有超能力的人,比如预言家可以检验一个人是否是隐藏在神民阵营的狼人、猎人可以开枪打死一名狼人。因为狼人白天隐藏的非常深,仅仅单人的行动往往不能限制狼人的行动,多人行动将会起到更好的效果。比如预言家和猎人一起行动将被检验出是狼人的“村民”直接打死,村庄将回归和平。
我们将这样的一对人所产生的战斗力记作 ww,值得注意的是,一个人可以被多次计算,比如预言家可以先后和猎人、女巫(或其他人)组合,即如果预言家和猎人的战斗力为 ww,预言家和女巫的战斗力为 w’w
′
,这三个人的战斗力之和为 w+w’w+w
′
。
不过因为经过“新月”事件,村庄贫苦破败,你需要支付一定的金额给各个被你聘用的村民,假设你邀请了k个村民,则需要 k(2n-k)k(2n−k) 块钱(nn 为村民总数),你的资金也不太足够,所以你希望资金的利用率最大,资金的利用率定义为:((被选择的人战斗力之和 // 你支付的资金))。除此之外有些人基于他们的重要性,是必须被选择的。你必须邀请他们来参加战斗(保证至少一人)。
输入格式
第一行包括两个整数 n,mn,m 分别表示 nn 个村民和有 mm 对人之间有战斗力。
接下来 mm 行,每行有三个整数 u_i,v_i,w_iu
i
,v
i
,w
i
(1 \le u_i,v_i \le n,(1≤u
i
,v
i
≤n, 1 \le w_i \le 100,1≤w
i
≤100, u_i \neq v_i)u
i
≠v
i
) 表示 这对人可以产生的战斗力 w_iw
i
。
接下来 nn 个数,对于第 ii 个数,00 表示第 ii 个人可参加战斗,11 表示第 ii 个人必须参加战斗(保证至少一个 11)。
对于简单版本,1 \leq n \leq 20,1≤n≤20, 0 \le m \le n(n-1)/20≤m≤n(n−1)/2;
对于中等版本,1 \leq n \leq 300,1≤n≤300, 0 \le m \le \min(1000, n(n-1)/2)0≤m≤min(1000,n(n−1)/2);
对于困难版本,1 \leq n \leq 400,1≤n≤400, 0 \le m \le \min(10000, n(n-1)/2)0≤m≤min(10000,n(n−1)/2)。
输出格式
对于简单版本和中等版本,输出一个 44 位小数,表示资金利用率的最大值,结果四舍五入;
对于困难版本,输出一个 66 位小数,表示资金利用率的最大值,结果四舍五入。
#include <bits/stdc++.h> using namespace std; int nec[30]; int com[30][30]; int n,m; int cal(int st) { int res=0; for(int i=0;i<n;i++) { if(st&(1<<i)) res++; } return res; } int main(){ cin>>n>>m; for(int j=0;j<m;j++) { int a,b,c; cin>>a>>b>>c; a--,b--; com[a][b]=c; } for(int i=0;i<n;i++){ cin>>nec[i]; } int end=(1<<n); double res=0; for(int st=0;st<end;st++) { int flag=0; for(int i=0;i<n;i++) { if(nec[i]==1) { if(!(st&(1<<i))) { flag=1; break; } } } if(flag) continue; int t=cal(st); double rr=0; for(int i=0;i<n;i++) { if(st&(1<<i)) { for(int j=0;j<n;j++) { if((i!=j)&&(st&(1<<j))) { rr+=com[j][i]; } } } } rr=rr*1.0/(t*(2*n-t)); res=max(rr,res); } printf("%.4f\n",res ); }
相关文章推荐
- 计蒜客 腾讯狼人杀(困难) 最大权密度子图变种
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017计蒜之道 第三场 腾讯狼人杀(简单)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017计蒜之道 第三场 腾讯狼人杀(简单)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
- 计蒜客 腾讯手机地图(模拟 数学)
- 获取股票简单数据:腾讯、新浪、东方财富。。。
- 计蒜客 简单图论(并查集+枚举)