洛谷 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; }