【解题思路】

  爆搜,状态f(r,x,y)表示剩下r刀,边长为x和y,对于每个状态枚举切成两块后的长度比或宽度比。复杂度o((n/2)n)。

【参考代码】

  1 #include <algorithm>
  2 #include <cstdio>
  3 #define REP(I,start,end) for(int I=(start);I<=(end);I++)
  4 #define PER(I,start,end) for(int I=(start);I>=(end);I--)
  5 #define REPs(I,start,end,step) for(int I=(start);I<=(end);I+=(step))
  6 #define PERs(I,start,end,step) for(int I=(start);I>=(end);I-=(step))
  7 #define maxint 32767
  8 #define maxlongint 2147483647
  9 #define maxint64 9223372036854775807ll
 10 using namespace std;
 11 typedef unsigned short US;
 12 typedef unsigned long UL;
 13 typedef long long LL;
 14 typedef unsigned long long ULL;
 15 inline int getint()
 16 {
 17     char ch=getchar();
 18     while((ch<'0'||ch>'9')&&ch!='-')
 19         ch=getchar();
 20     int result=0;
 21     bool impositive=ch=='-';
 22     if(impositive)
 23         ch=getchar();
 24     while(ch>='0'&&ch<='9')
 25     {
 26         result=(result<<3)+(result<<1)+ch-'0';
 27         ch=getchar();
 28     }
 29     return impositive?-result:result;
 30 }
 31 inline int putint(int n)
 32 {
 33     int result=1;
 34     char* sav=new char[20];
 35     bool impositive=n<0;
 36     if(impositive)
 37     {
 38         putchar('-');
 39         n=-n;
 40     }
 41     sav[0]=n%10+'0';
 42     while(n/=10)
 43         sav[result++]=n%10+'0';
 44     PER(i,result-1,0)
 45         putchar(sav[i]);
 46     delete []sav;
 47     return result+impositive;
 48 }
 49 inline LL getLL()
 50 {
 51     char ch=getchar();
 52     while((ch<'0'||ch>'9')&&ch!='-')
 53         ch=getchar();
 54     LL result=0ll;
 55     bool impositive=ch=='-';
 56     if(impositive)
 57         ch=getchar();
 58     while(ch>='0'&&ch<='9')
 59     {
 60         result=(result<<3)+(result<<1)+ch-'0';
 61         ch=getchar();
 62     }
 63     return impositive?-result:result;
 64 }
 65 inline int putLL(LL n)
 66 {
 67     int result=1;
 68     char* sav=new char[20];
 69     bool impositive=n<0;
 70     if(impositive)
 71     {
 72         putchar('-');
 73         n=-n;
 74     }
 75     sav[0]=n%10+'0';
 76     while(n/=10)
 77         sav[result++]=n%10+'0';
 78     PER(i,result-1,0)
 79         putchar(sav[i]);
 80     delete []sav;
 81     return result+impositive;
 82 }
 83 template<typename integer> inline int read_int(integer &n)
 84 {
 85     char ch=getchar();
 86     while((ch<'0'||ch>'9')&&ch!='-')
 87         ch=getchar();
 88     int result=n=integer(0);
 89     bool impositive=ch=='-';
 90     if(impositive)
 91         ch=getchar();
 92     while(ch>='0'&&ch<='9')
 93     {
 94         n=(n<<3)+(n<<1)+integer(ch-'0');
 95         result++;
 96         ch=getchar();
 97     }
 98     if(impositive)
 99     {
100         n=-n;
101         result++;
102     }
103     return result;
104 }
105 template<typename integer> inline int write_int(integer n)
106 {
107     int result=1;
108     char* sav=new char[20];
109     bool impositive=n<0;
110     if(impositive)
111     {
112         putchar('-');
113         n=-n;
114     }
115     sav[0]=n%10+'0';
116     while(n/=10)
117         sav[result++]=n%10+'0';
118     PER(i,result-1,0)
119         putchar(sav[i]);
120     delete []sav;
121     return result+impositive;
122 }
123 template<typename T> inline bool getmin(T &target,T pattern)
124 {
125     bool can=pattern<target;
126     if(can)
127         target=pattern;
128     return can;
129 }
130 template<typename T> inline bool getmax(T &target,T pattern)
131 {
132     bool can=pattern>target;
133     if(can)
134         target=pattern;
135     return can;
136 }
137 //==========================================Header Template================================================
138 #include <iomanip>
139 #include <iostream>
140 double DFS(int rest,double _x,double _y)
141 {
142     if(rest==1)
143         return _x>_y?_x/_y:_y/_x;
144     double result=maxlongint;
145     REP(i,1,rest>>1)
146     {
147         long double x0=_x/rest,y0=_y/rest,_r=rest-i;
148         getmin(result,min(max(DFS(i,x0*i,_y),DFS(_r,x0*_r,_y)),max(DFS(i,_x,y0*i),DFS(_r,_x,y0*_r))));
149     }
150     return result;
151 }
152 int main()
153 {
154     int x=getint(),y=getint(),n=getint();
155     cout<<setiosflags(ios::fixed)<<setprecision(6)<<DFS(n,x,y)<<endl;
156     return 0;
157 }
View Code