你没做一道题目都需要记录吸收,要不然你所花费的时间精力就都是白搭!
【问题描述】
标题:承压计算
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。
其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。
假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。
【问题分析】
问题乍一看很难,我拿的题目直接跳过了,放了两三天才回头来做。害怕困难永远比困难本身更可怕!问题其实很简单,就是将当前金属块的重量平分给下面的两个金属块,从上往下处理,最终就可以得到最后一行30个电子秤上盛放的重量。找出最大最小值,在按照比例换算就可以得到最终的最大示数。(因为单位不一样,所以电子秤所显示的示数,并不是初始时的重量,要注意)
但问题的关键不在这里,数据实在太多了,看得我眼花,这么多数据我怎么去处理。
很显然在这里我们需要利用二维数组来存放这些数据。
一共有30行,最大有60列,所以我们初始化一个30维60列的二维数组来存放他。
不难发现:
29行从下标0开始,一共有30个金属块
28行从下标1开始,一共有29个金属块
27行从下标2开始,一共有28个金属块
……
1行从下标28开始,一共有2个金属块
0行从下标29开始,一共有1个金属块
每一行的每一个金属块下标相差2
知道这些必要的规律,我们就可以通过读文件的方式,初始化指定位置的数据。
后面自然水到渠成,从上往下,找到存放金属块的位置,把它的重量平分到下面两个金属块。
最终可以得到最后一行30个电子秤上所承受的重量!!!
再按比例,求出示数!代码如下
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
using namespace std;
double a[30][60];
int main(){
memset(a,0,sizeof(a));
fstream infile("1.txt",ios::in);
if(!infile){
cerr<<"open error!";
exit(-1);
}
int temp;
//---------------【读文件初始化数组 】------------------
for(int i=0;i<29;i++){
int count=i+1;//每一行元素的个数
int cnt=0;
for(int j=29-i;cnt<count;j+=2){
infile>>a[i][j];
cnt++;
}
}
//-----------【将重量平均分配给下面的物品】---------------
for(int i=0;i<=28;i++){
int count=i+1;
int cnt=0;//计数专用
for(int j=29-i;cnt<count;j+=2){
double temp=a[i][j]/2.0;
a[i+1][j-1]+=temp;
a[i+1][j+1]+=temp;
cnt++;
}
}
//-----------【将最后一行单独存储到数组中,并找到最大值最小值】-------------
int cnt=0;
double b[30];
for(int j=0;j<60;j+=2){
b[cnt++]=a[29][j];
}
double min=b[0];
double max=b[0];
for(int i=1;i<30;i++){
if(b[i]>max){
max=b[i];
}else if(b[i]<min){
min=b[i];
}
}
//----------【按照比例算出最大重量】-------------
double max_w=(2086458231/min)*max;
cout<<max_w<<endl;
return 0;
}
当数值很大时,系统会默认使用科学计数法来显示,看不出直观的结果
我们可以在输出的前一行加上——cout.setf(ios::fixed,ios::floatfield);
最终结果为72665192664