[DFS]JZOJ 2941 贿赂
分析
今日份水题
首先如果我们将每个人的忠诚值的都统计出来以后,我们可以暴力DFS用2^9的时间统计出其概率
然后我们发现统计忠诚值其实最大就9!的时间复杂度,而且因为有上限,肯定跑不满
所以两个DFS套在一起,时间复杂度O(能过)<O(9!*2^9)
#include <iostream> #include <cstdio> using namespace std; const int N=10; int n,k,A; int l[N],h[N]; bool b[N]; double ans; double DFS(int wch,int ok,int B) { if (wch==n+1) return (ok>n/2)?1.0:1.0*A/(A+B); return h[wch]/100.0*DFS(wch+1,ok+1,B)+(100.0-h[wch])/100.0*DFS(wch+1,ok,B+l[wch]); } void DFS(int wch,int candy) { if (wch==n+1||!candy) { ans=max(ans,DFS(1,0,0)); return; } for (int i=0;i<=min((100-h[wch])/10,candy);i++) { h[wch]+=i*10; DFS(wch+1,candy-i); h[wch]-=i*10; } } int main() { scanf("%d%d%d",&n,&k,&A); for (int i=1;i<=n;i++) scanf("%d%d",&l[i],&h[i]); DFS(1,k); printf("%.6lf",ans); }
在日渐沉没的世界里,我发现了你。