当前位置:   article > 正文

蓝桥杯 图形排版

蓝桥杯 图形排版

题目链接:1.图形排版 - 蓝桥云课 (lanqiao.cn)

本道题暴力算法思路是挨个选择不放入当前图片,但是很显然不可能满分。因此考虑优化:在暴力的过程中每次重新选择一个图片放入当前行,只有这一行是需要重新计算的,后续的行数高度是被重复使用的,因此可以进行预处理,计算出使用第i张图片作为行首的后续所有图片的高度。这样就大大减少了计算量。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5;
  4. int W[N] = {0},H[N]={0};
  5. int st[N] = {0};//表示从第i个开始作为首行铺设的高度
  6. int n=0,M=0;
  7. void solve(int &now,int &w,int &h)//注意此处为引用,便于在调用函数中使用其他变量
  8. //这里的函数通过设置多个变量,为不同用途的使用提供方便
  9. //多使用函数:维护方便,使用方便。
  10. {
  11. while(now<n) //对当前行进行填充,至填满或者排版完成
  12. {
  13. if(W[now]+w<M)
  14. {
  15. w+=W[now];//更新数据
  16. h = max(h,H[now]);
  17. }
  18. else//最后一个图片需要缩放
  19. {
  20. h = max(h,(int)ceil(H[now]*(M-w)*1.0/W[now])); //注意这里使用向上取整前
  21. //要将分子/分母变为浮点数类型,否则直接向下取整了
  22. //而且要在运算过程中改变数据类型,而不是计算出结果后
  23. w++;
  24. now++;
  25. break;
  26. }
  27. now++;
  28. }
  29. }
  30. int calc(int now,int w,int h)//从当前行(宽度高度均已知)开始铺设
  31. {
  32. solve(now,w,h); //因为是引用传送数据,所以now会动态改变
  33. return h+st[now];//返回填充完当前行的高度以及后续几行的高度之和
  34. }
  35. int main()
  36. {
  37. ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
  38. //输入数据很多需要优化
  39. cin>>M>>n;
  40. for(int i=0;i<n;i++)//录入数据
  41. {
  42. cin>>W[i]>>H[i];
  43. }
  44. //进行预处理,
  45. st[n] = 0;
  46. for(int i=n-1;i>=0;i--)//倒序是因为处理过程中需要用到后续的值
  47. {
  48. st[i] = calc(i,0,0);
  49. }
  50. //在先前我们已经预处理完成以各个图片作为行首以及后续行的长度
  51. //接下来只需要挨个考虑删除的照片并进行筛选即可
  52. //1.不放第i张,并从当前行开始铺设
  53. //2.将第i张放入用于下一轮计算
  54. int pre_h=0,nw=0,nh=0,ans=INT_MAX;//不包括当前行的高度,当前行的宽度高度
  55. //选出最小值应该初值很大
  56. for(int i=0;i<n;i++){
  57. //1. 不放当前图片
  58. ans = min(ans,pre_h+calc(i+1,nw,nh));
  59. //2. 放入当前图片
  60. if(W[i]+nw<M)
  61. {
  62. nw+=W[i];//更新数据
  63. nh = max(nh,H[i]);
  64. }
  65. else//最后一个图片需要缩放
  66. {
  67. nh = max(nh,(int)ceil(H[i]*(M-nw)*1.0/W[i])); //注意这里使用向上取整前
  68. //要将分子/分母变为浮点数类型,否则直接向下取整了
  69. //而且要在运算过程中改变数据类型,而不是计算出结果后
  70. nw = 0;
  71. pre_h +=nh;//注意更新
  72. nh = 0;
  73. }
  74. }
  75. cout<<ans<<endl;
  76. return 0;
  77. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/253418
推荐阅读
相关标签
  

闽ICP备14008679号