题解 P4160 【[SCOI2009]生日快乐】
本题可以用大法师DFS氵过(虽然我一开始想的是DP)
易证x上分割点(姑且把ta当点)>=x/n,y同理
然后dfs(当前某边长,其邻边长,需分几块)
愉快的大法师即可
上代码
#include<bits/stdc++.h>
using namespace std;
int IP1,IP2,IP3;
double dfs(double x,double y,int n)
{
if(n==1)
{
return max(x,y)/min(x,y);//所求为长边比短边,边界为需分出1块(不需分?)
}
double ans=9999999999,mx=x/n,my=y/n;//mx(y)=minx(y)?
for(int i=1;i<=n/2;i++)
{
ans=min(ans,max(dfs(mx*i,y,i),dfs(x-mx*i,y,n-i)));
ans=min(ans,max(dfs(x,my*i,i),dfs(x,y-my*i,n-i)));
}
return ans;
}
int main()
{
cin>>IP1>>IP2>>IP3;//IP即input
printf("%.6lf",dfs(IP1,IP2,IP3));
}

浙公网安备 33010602011771号