鱼C论坛

 找回密码
 立即注册
查看: 2230|回复: 6

题目85:考察矩形网格里的矩形数量

[复制链接]
发表于 2016-8-9 17:27:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 欧拉计划 于 2016-8-9 17:36 编辑
Counting rectangles

By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:

QQ20160809-1@2x.png


Although there exists no rectangular grid that contains exactly two million rectangles, find the area of the grid with the nearest solution.


题目:

仔细数的话可以看出一个 3×2 的矩形网格里包含 18 个矩形:

QQ20160809-1@2x.png


虽然没有哪个矩形网格包含正好两百万个矩形,找出包含最接近两百万个矩形的矩形网格的面积。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-27 03:50:06 | 显示全部楼层
  1. 36 77 8
  2. [Finished in 0.5s]

  3. # ((1+m)*m/2)*((1+n)*n/2) = 2000000 ->  n*m*(n+1)*(m+1) = 8000000

  4. nearest = 1000000
  5. for i in range(1,1000):
  6.         for j in range(1,1000):
  7.                 near = abs(8000000 - i*j*(i+1)*(j+1))
  8.                 if nearest > near:
  9.                         nearest = near
  10.                         neari = i
  11.                         nearj = j
  12. print (neari,nearj,nearest)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-28 13:54:42 | 显示全部楼层
  1. # encoding:utf-8
  2. # 找出包含最接近200万个矩形的面积
  3. from time import time
  4. def euler085(N=2000000):
  5.     a, b, t = 0, 0, N
  6.     for i in range(1, int((4 * N) ** 0.25 + 1)):
  7.         for j in range(1, int(((4 * N) / i ** 2) ** 0.5 + 1)):
  8.             tmp = (i * (i + 1) * j * (j + 1) / 4)
  9.             if  abs(tmp - N) < t:
  10.                 t = abs(tmp - N)
  11.                 a, b = i, j
  12.             if tmp > N and abs(tmp - N) > t:
  13.                 break
  14.     print(a, b, int(t))
  15. if __name__ == '__main__':
  16.     start = time()
  17.     euler085()
  18.     print('cost %.6f sec' % (time() - start))
复制代码

36 77 2
cost 0.006001 sec
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 15:01:52 | 显示全部楼层
  1. def f(x):
  2.   return x * (x + 1) // 2

  3. target = int(2*10**6)
  4. curr = 0
  5. ans = 0
  6. for i in range(1, 999999999999):
  7.   a = f(i)
  8.   for j in range(1, i + 1):
  9.     b = f(j)
  10.     if abs(curr - target) > abs(a * b - target):
  11.       curr = a * b
  12.       ans = i * j
  13.     if a * b > target:
  14.       break
  15.   if a > target:
  16.     break

  17. print(ans)
复制代码

https://github.com/devinizz/project_euler/blob/master/page02/85.py
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-1 10:39:53 | 显示全部楼层
2772

Process returned 0 (0x0)   execution time : 0.029 s
Press any key to continue.
  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;

  4. const int M = 2001;
  5. const int STANDARD = 2e6;

  6. int Cn_2(int n){
  7.   return n*(n-1)/2;
  8. }

  9. int main(){
  10.   int dif = 2e6;//已经充分大
  11.   int ans;
  12.   for (int m = 1;m <= M;m++){
  13.     for (int n = m;n <= M;n++){
  14.       int t = Cn_2(n+1) * Cn_2(m+1);//矩形总个数公式
  15.       if (abs(t-STANDARD) < dif)  {dif = abs(t-STANDARD); ans = m*n;}

  16.       if (t > STANDARD) break;//由组合数的递增可知,后面的总个数必然不会更接近2e6
  17.     }
  18.   }
  19.   cout << ans << endl;
  20.   return 0;
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-12 15:00:57 From FishC Mobile | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2021-6-24 17:23 编辑

C++ 0ms
  1. /*
  2.             m
  3.   ┏━━━━━━━━━┓
  4.   ┃                  ┃
  5. n ┃                  ┃
  6.   ┃                  ┃
  7.   ┗━━━━━━━━━┛

  8. (m(m+1)/2)(n(n+1)/2)=2e6
  9. m(m+1)n(n+1)=8e6
  10. m(m+1)=8e6/n(n+1)
  11. m=(sqrt(3.2e7/n(n+1)+1)-1)/2
  12. =sqrt(8e6/n(n+1)+0.25)-0.5
  13. */
  14. #include<iostream>
  15. #include<limits>
  16. #include<cmath>



  17. int main() {
  18.     using namespace std;
  19.     ios::sync_with_stdio(false);

  20.     const int UPPER_BOUND = ceil(sqrt(4e6 + 0.25) - 0.5);//n=1
  21.     int n, m, temp, s = 0, diff, min_diff = numeric_limits<int>::max();
  22.     double m_;


  23.     for (n = 1; n <= UPPER_BOUND; n++) {
  24.         temp = n * (n + 1);

  25.         m = m_ = sqrt(8e6 / temp + 0.25) - 0.5;
  26.         diff = abs(8000000 - m * (m + 1) * temp);

  27.         if (diff < min_diff) {
  28.             min_diff = diff;
  29.             s = m * n;
  30.         }

  31.         m = ceil(m_);
  32.         diff = abs(8000000 - m * (m + 1) * temp);

  33.         if (diff < min_diff) {
  34.             min_diff = diff;
  35.             s = m * n;
  36.         }
  37.     }


  38.     cout << s << endl;
  39.     return 0;
  40. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-14 22:37:39 | 显示全部楼层
  1. /*
  2. 答案:2772
  3. 耗时:0.015695秒
  4.       0.0043418秒(六核)
  5. */
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <omp.h>
  9. using namespace std;

  10. int main(void)
  11. {
  12.   double t = omp_get_wtime();
  13.   long long nArea = 0, nCount = 0;
  14. #pragma omp parallel for shared(nArea,nCount) collapse(2)
  15.   for (int m = 1; m <= 100; ++m)//枚举大矩形
  16.   {
  17.     for (int n = 1; n <= 100; ++n)
  18.     {
  19.       long long nCount1 = 0;
  20.       for (int l = 0; l <= m - 1; ++l)//枚举矩形的左上点
  21.       {
  22.         for (int u = 0; u <= n - 1; ++u)
  23.           nCount1 += (m - l)*(n - u);
  24.       }
  25.       if (abs(nCount1 - 2000000) < abs(nCount - 2000000))//选择矩形数最靠近2000000的大矩形
  26.       {
  27. #pragma omp critical
  28.         {
  29.           //保留结果
  30.           //防止其它线程已经改写了数据,再次确认
  31.           if (abs(nCount1 - 2000000) < abs(nCount - 2000000))
  32.           {
  33.             nCount = nCount1;
  34.             nArea = m;
  35.             nArea *= n;
  36.           }
  37.         }
  38.       }
  39.     }
  40.   }
  41.   t = omp_get_wtime() - t;
  42.   cout << nArea << endl << t << endl;
  43.   return 0;
  44. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表