1. 程式人生 > 實用技巧 >洛谷 P4160 [SCOI2009]生日快樂 題解

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