• 蓝桥杯 图形排版


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

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

    1. #include
    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//对当前行进行填充,至填满或者排版完成
    12. {
    13. if(W[now]+w
    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//录入数据
    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
    57. //1. 不放当前图片
    58. ans = min(ans,pre_h+calc(i+1,nw,nh));
    59. //2. 放入当前图片
    60. if(W[i]+nw
    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<
    76. return 0;
    77. }

  • 相关阅读:
    数据解读!理想L9冲刺「月销过万」,从BBA手中抢份额
    [SDM450][Android9.0] 禁止第一次使用谷歌拼音输入法弹出申请使用联系人弹框
    基于ABP实现DDD--领域服务、应用服务和DTO实践
    编码规范、git 规范
    HarmonyOS Stage模型 应用配置文件讲解
    Java 内存模型 JMM
    CO02工单组件,新增/删除/修改
    Android12启动崩溃 no namespace called
    FLStudio21水果免费版本FL2023电音制作软件
    学习c#的第二十三天
  • 原文地址:https://blog.csdn.net/m0_65414734/article/details/136621014