luogu P4160 [SCOI2009]生日快乐

传送门

考虑因为每个人的蛋糕体积要相等,如果切了一刀,那么要使得分当前蛋糕的人根据分成的两部分蛋糕的体积分成两部分人,所以假设当前有n人,切的这一刀要是在x或y的\(\frac{k}{n}(k\in N_+,k\in [1,n])\)处,然后两边分别有\(k\)\(n-k\)个人分,所以分治做下去救星了

更多内容详见代码

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5)

using namespace std;
il LL rd()
{
    LL x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
db dfs(int n,db x,db y)
{
  if(x<y) swap(x,y);
  if(n==1) return x/y;
  db an=1e18;
  for(int i=1;i<=n/2;i++) an=min(an,max(dfs(i,x/(db)n*(db)i,y),dfs(n-i,x/(db)n*(db)(n-i),y)));
  for(int i=1;i<=n/2;i++) an=min(an,max(dfs(i,x,y/(db)n*(db)i),dfs(n-i,x,y/(db)n*(db)(n-i))));
  return an;
}

int main()
{
  db x=rd(),y=rd();
  int n=rd();
  if(x<y) swap(x,y);
  printf("%.6lf\n",dfs(n,x,y));
  return 0;
}


posted @ 2018-10-17 20:39  ✡smy✡  阅读(103)  评论(0编辑  收藏  举报