蓝桥杯刷题——承压计算

2,002 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

这道题是17年省赛的一道题,可以说的上是简单的一道题,但是如果没找对方法,这道题还是不是很好解的。我认为这道题还是可以看作一道简单的动态规划题来做的,如果是往这个方向去想,那么很快就能得到题解。、

题目

每块原料大小相同,但重量不同,呈金字塔状排列,每一块原料的重量都能均匀的落在下方的原料上。在金字塔的最下面有一排电子秤。电子秤的计算精度很高,现在最小的电子秤示数为2086458231,要求求出最大的电子秤示数。

金字塔如图,最下一排X是电子秤。

image.png

思路

最小电子秤示数我们已经知道了,如何求出最大电子秤示数呢?我们先求出电子秤承压的重量,用最大电子秤承压的重量除以最小电子秤承压的重量,然后乘以2086458231,就能得出最大电子秤示数了。这是一个很简单的小学数学,大家仔细想想就应该能明白了。那么下一步,如何求出这些电子秤承压的重量呢?就从最上面的原料开始,它的重量会平分在第二排的原料上,将第二排原料的重量加上,再从第三排原料开始,加上第二排的原料,以此类推,最后就能得出第29排的原料的总重量,最后压在电子秤上,刚好就能求出这些电子秤承压的重量了。最后找出最大的承压重量以及最小的承压重量。就可以求出最大的电子秤示数了。这也和动态规划有些类似,从最小的问题开始入手,一步步解决了最后的问题。

代码

#include<bits/stdc++.h>
using namespace std;
double data[30][30];
double data2[31];
int main()
{
  for(int i=1;i<=29;i++){
    for(int j=1;j<=i;j++){
      cin>>data[i][j];
    }
  }
  for(int i=2;i<=29;i++){
    for(int j=1;j<=i;j++){
      if(j<i)
        data[i][j]=data[i-1][j-1]/2+data[i-1][j]/2+data[i][j];
      else
        data[i][j]=data[i-1][j-1]/2+data[i][j];
    }
  }
  
  for(int i=1;i<=30;i++){
    if(i<30)
      data2[i]=data[29][i-1]/2+data[29][i]/2;
    else
      data2[i]=data[29][i-1]/2;
  }
  sort(data2,data2+31);
  long long result=data2[30]/data2[1]*2086458231;
  cout<<result;
  return 0;
}