2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
2017-06-20 22:36
253 查看
传送门
不久前,腾讯推出了一款改进后的狼人杀游戏。如下是这款游戏的背景和详细规则:
很久很久以前,在莱茵河畔一座岸壁陡峭的山顶上,有一个名叫“杜斯特瓦德”的小村庄。不久前,这个小村庄每晚都会受到狼人的侵袭。每个夜晚,狼人都会在村中进行抢劫,并且会有一个村民成为这群狼人的牺牲品。然而村民们不会坐以待毙,他们试图在白天找到这些狼人并处决他们。
作为杜斯特瓦德村的长老,你需要组织村民来对抗狼人,村民包括许多有超能力的人,比如预言家可以检验一个人是否是隐藏在神民阵营的狼人、猎人可以开枪打死一名狼人。因为狼人白天隐藏的非常深,仅仅单人的行动往往不能限制狼人的行动,多人行动将会起到更好的效果。比如预言家和猎人一起行动将被检验出是狼人的“村民”直接打死,村庄将回归和平。
我们将这样的一对人所产生的战斗力记作 ww,值得注意的是,一个人可以被多次计算,比如预言家可以先后和猎人、女巫(或其他人)组合,即如果预言家和猎人的战斗力为 ww,预言家和女巫的战斗力为 w'w′,这三个人的战斗力之和为 w+w'w+w′。
不过因为经过“新月”事件,村庄贫苦破败,你需要支付一定的金额给各个被你聘用的村民,假设你邀请了k个村民,则需要 k(2n-k)k(2n−k)块钱(nn 为村民总数),你的资金也不太足够,所以你希望资金的利用率最大,资金的利用率定义为:((被选择的人战斗力之和 // 你支付的资金))。除此之外有些人基于他们的重要性,是必须被选择的。你必须邀请他们来参加战斗(保证至少一人)。
接下来 mm 行,每行有三个整数 u_i,v_i,w_iui,vi,wi (1
\le u_i,v_i \le n,(1≤ui,vi≤n, 1
\le w_i \le 100,1≤wi≤100, u_i
\neq v_i)ui≠vi)表示
这对人可以产生的战斗力 w_iwi。
接下来 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)。
对于困难版本,输出一个 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_iui,vi,wi (1
\le u_i,v_i \le n,(1≤ui,vi≤n, 1
\le w_i \le 100,1≤wi≤100, u_i
\neq v_i)ui≠vi)表示
这对人可以产生的战斗力 w_iwi。
接下来 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 位小数,表示资金利用率的最大值,结果四舍五入。
样例输入1
3 1 1 2 3 1 0 0
样例输出1
0.3750
样例输入2
3 1 1 2 3 0 0 1
样例输出2
0.3333
#include <iostream> #include <stdio.h> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <stack> #include <cmath> #include <map> #include <bitset> #include <set> #include <vector> #include <functional> using namespace std; #define pi acos(-1) #define endl '\n' #define rand() srand(time(0)); #define me(x) memset(x,0,sizeof(x)); #define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++) #define close() ios::sync_with_stdio(0); typedef long long LL; const int INF=0x3f3f3f3f; const LL LINF=0x3f3f3f3f3f3f3f3fLL; //const int dx[]={-1,0,1,0,-1,-1,1,1}; //const int dy[]={0,1,0,-1,1,-1,1,-1}; const int maxn=1e4+5; const int maxx=1e6+3; const double EPS=1e-7; const int MOD=10000007; typedef pair<int, int>P; #define mod(x) ((x)%MOD); template<class T>inline T min(T a,T b,T c) { return min(min(a,b),c);} template<class T>inline T max(T a,T b,T c) { return max(max(a,b),c);} template<class T>inline T min(T a,T b,T c,T d) { return min(min(a,b),min(c,d));} template<class T>inline T max(T a,T b,T c,T d) { return max(max(a,b),max(c,d));} //typedef tree<pt,null_type,less< pt >,rb_tree_tag,tree_order_statistics_node_update> rbtree; /*lch[root] = build(L1,p-1,L2+1,L2+cnt); rch[root] = build(p+1,R1,L2+cnt+1,R2);中前*/ /*lch[root] = build(L1,p-1,L2,L2+cnt-1); rch[root] = build(p+1,R1,L2+cnt,R2-1);中后*/ long long gcd(long long a , long long b){if(b==0) return a;a%=b;return gcd(b,a);} #define FOR(x,n,i) for(int i=x;i<=n;i++) #define FOr(x,n,i) for(int i=x;i<n;i++) #define W while int n,m,sum=0,num=0; int vis[maxn],mapp[30][30],cnt[30]; double ans=0; void dfs(int x) { if(x==n+1) { // cout<<num<<endl; double val=sum*1.0/(double)(num*(2*n-num));//取效率大值 if(ans<val) ans=val; return ; } FOR(0,1,i)//0表示不取 1表示取 { if(vis[x]&&i==0) continue; cnt[x]=i; if(cnt[x]) { FOr(1,x,j)//只取在x前面的农民 { if(cnt[j]) sum+=mapp[j][x]; // cout<<j<<" "<<x<<endl; } num++; } dfs(x+1); if(cnt[x])//回溯 { FOr(1,x,j) if(cnt[j]) sum-=mapp[j][x]; num--; } } } int main() { cin>>n>>m; me(mapp);me(vis);me(cnt); FOR(1,m,i) { int x,y,z; cin>>x>>y>>z; mapp[x][y]=z;mapp[y][x]=z; } FOR(1,n,i) cin>>vis[i]; dfs(1); printf("%.4lf\n",ans); }
相关文章推荐
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- [最大密度子图] 2017 计蒜之道 初赛 第三场 腾讯狼人杀
- [最大密度子图] 2017 计蒜之道 初赛 第三场. 腾讯狼人杀
- 2017计蒜之道 第三场 腾讯狼人杀(简单)
- 2017计蒜之道 第三场 腾讯狼人杀(简单)
- 2017 计蒜之道 初赛 第三场 A. 腾讯课堂的物理实验
- 2017 计蒜之道 初赛 第三场 A. 腾讯课堂的物理实验
- 2017 计蒜之道 初赛 第三场 A. 腾讯课堂的物理实验
- 2017 计蒜之道 初赛 第三场 A. 腾讯课堂的物理实验