洛谷 P4160 [SCOI2009]生日快乐 题解

这道题的思路很明显就是搜索。

考虑每次切割只有两种大的情况:平行长边或平行短边。

不妨设平行长边,则切割的长度即为mx的公倍数(mx等于长边长度除以还需分割的数量)。

那么就是一个比较容易实现的搜索题。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> 
#define int long long
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;--i)
using namespace std;
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    return f*x;
}
inline void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
int n;
double x,y;
double dfs(double x,double y,int num)
{
    if(num==1) return max(x,y)/min(x,y);
    double mx=x/num,my=y/num;
    double ans=99999999,ansx,ansy;
    for(int i=1;i<=num/2;++i)
    {
        ansx=max(dfs(mx*i,y,i),dfs(x-mx*i,y,num-i));
        ansy=max(dfs(x,my*i,i),dfs(x,y-my*i,num-i));
        ans=min(ans,min(ansx,ansy));
    }
    return ans;
}
signed main()
{
    cin>>x>>y;
    n=read();
    double out=dfs(x,y,n);
    printf("%.6lf",out);
    return 0;
}

 

posted @ 2020-09-10 19:00  handsome_zyc  阅读(260)  评论(0编辑  收藏  举报