题解 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));
} 
posted @ 2019-02-01 20:59  G_A_TS  阅读(536)  评论(0)    收藏  举报