蓝桥杯真题——承重计数

你没做一道题目都需要记录吸收,要不然你所花费的时间精力就都是白搭!

【问题描述】


标题:承压计算

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值