荣誉版主
- 积分
- -2403
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2010-5-4
- 最后登录
- 1970-1-1
|
说说我的思路:
可以证明最优解的情况一定是方格可以填满行的,或是方格可以填满列的(填满了再往上排)。
可以分行列来考虑。
如果是行,行的长度为l.,考虑方格长度为l/n,l/(n-1)...l的情况,找最优值(二分优化)
在分列来考虑,记录最优值。
我的代码:
- bool fits(float l, float w, int m, int n)
- {
- assert(l>0 && w>=0 && m>0 && n>0);
- if (n <= m && w >= l/m)
- return true;
- if (w < l/m) return false;
- return fits(l, w-l/m, m, n-m);
- }
- float CalcLen(int l, int w, int n)
- {
- assert(l>0 && w>0 && n>0);
- int nLow = 1;
- int nHigh = n;
- int nBest = -1;
- while (nLow < nHigh)
- {
- int nMid = (nLow + nHigh)/2;
- if (fits(l, w, nMid, n))
- {
- nHigh = nMid-1;
- nBest = nMid;
- }
- else
- nLow = nMid+1;
- }
- if (nLow == nHigh && fits(l, w, nLow, n))
- nBest = nLow;
- return (float)l/(float)nBest;
- }
- float GetLargest(int l, int w, int n)
- {
- assert(l>0 && w>0 && n>0);
- float r1 = CalcLen(l, w, n);
- float r2 = CalcLen(w, l, n);
- return r1>r2?r1:r2;
- }
复制代码 |
|