#深搜,期望#CF105B Dark Assembly
阿新 • • 發佈:2020-10-22
分析
題目強調賄賂要在投票開始前完成說明分糖和成功率可以分開計算
那麼分糖考慮直接暴搜,由於題目並沒有說糖必須全部分完,
所以每一次分完一顆糖後均要求當前狀態下的成功率
那成功率怎麼求呢,考慮暴搜每個議員是否贊同或反對,
當贊同人數超過一半時,成功率為當前概率,否則要乘上 \(\frac{A}{A+B}\) ,
這樣按照題目要求算出成功率,最後取最大值
程式碼
#include <cstdio> #define rr register using namespace std; int n,mid,A,a[11],b[11],k; double ans; inline void ev(int dep,int cnt,double pro,int deny,double &sum){ if (!pro) return; if (dep==n){ if (cnt>=mid) sum+=pro; else sum+=pro*A/(A+deny); return; } ev(dep+1,cnt+1,pro*a[dep+1]/10.0,deny,sum); ev(dep+1,cnt,pro-pro*a[dep+1]/10.0,deny+b[dep+1],sum); } inline void dfs(int dep,int swe){ rr double sum=0; ev(0,0,1,0,sum); ans=ans>sum?ans:sum; if (dep==n||!swe) return; for (rr int i=0;i<=swe;++i) if (a[dep+1]+i<=10) a[dep+1]+=i,dfs(dep+1,swe-i),a[dep+1]-=i; } signed main(){ scanf("%d%d%d",&n,&k,&A); mid=n/2+1; for (rr int i=1;i<=n;++i) scanf("%d%d",&b[i],&a[i]),a[i]/=10; dfs(0,k); return !printf("%lf",ans); }